力扣 704题 二分查找(熟悉又陌生的二分查找)

Question 704-binary search

解题思路

其实,二分法查找这一老掉牙的算法看上去已经没有什么科普的必要了,但是,当不少人实际用起来的时候,却总对这一算法抱有这样那样的疑惑。比如:

  1. 中间值究竟怎么取?
  2. 查找的区间应该包括边界吗?
  3. 我老是害怕因为边界值的取值问题导致漏掉了想查找的值怎么办?

其实,要解决以上 3 点疑惑,只需要记住一个事实:边界其实取为开区间,也可以为闭区间,只要牢记二分查找的思想。中间值的地址既可以是(左边界的地址值 + 右边界的地址值)/ 2 的向上取整,也可以是向下取整。这些东西其实对算法本身并没有影响。

但是,从遵从程序员本能的角度出发,你可以听取我的一点小建议:

  1. 区间应该是左开右闭的

  2. 为了始终维护条件 1,在循环查找的过程中,中间值地址如果赋给左边界,那么应该是向上取整。而如果是赋给右边界,则应该向下取整。

  3. 严谨考虑,大胆心细,不用前怕狼后怕虎。

代码

class Solution {
    public int search(int[] nums, int target) {

        int head = 0, tail = nums.length;

        while (head < tail) {
            
            int mid = (head + tail) >> 1;

            if (nums[mid] < target) {

                head = mid + 1;
            } else if (nums[mid] > target) {

                tail = mid;
            } else {

                return mid;
            }
        }

        return -1;
    }
}
posted @ 2021-07-08 15:48  寻落英以得度  阅读(55)  评论(0)    收藏  举报