「算法不好玩」1-二分查找的基本思想

288 阅读1分钟

摘要:二分查找的基本思想是「减而治之」,即逐渐缩小搜索区间。「减而治之」是「分而治之」的特例,「分治算法」在拆分子问题、并解决子问题以后,需要合并子问题的解。

而「减治算法」可以适用的问题,每一次把问题的规模缩小到原来的一半,即每一次把问题转换成为其中一个子问题。

生活中的二分查找

猜价格游戏。

二分查找入门问题

二分查找的基本问题是「力扣」第 704 题。

public class Solution {

    public int search(int[] nums, int target) {
        int len = nums.length;
        int left = 0;
        int right = len - 1;
        // 目标元素可能存在在区间 [left..right]
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                // 下一轮搜索区间 [mid + 1..right]
                left = mid + 1;
            } else {
                // 下一轮搜索区间 [left..mid - 1]
                right = mid - 1;
            }
        }
        return -1;
    }
}

请大家思考:

  • 为什么需要取中间数?
  • 取三分之一位置、四分之三位置是不是可以?

答案:输入数组有序,取区间里的任意一个位置都可以,在对区间一无所知的情况下,取中间是最好的。