力扣 704题 二分查找(熟悉又陌生的二分查找)
Question 704-binary search
解题思路
其实,二分法查找这一老掉牙的算法看上去已经没有什么科普的必要了,但是,当不少人实际用起来的时候,却总对这一算法抱有这样那样的疑惑。比如:
- 中间值究竟怎么取?
- 查找的区间应该包括边界吗?
- 我老是害怕因为边界值的取值问题导致漏掉了想查找的值怎么办?
其实,要解决以上 3 点疑惑,只需要记住一个事实:边界其实取为开区间,也可以为闭区间,只要牢记二分查找的思想。中间值的地址既可以是(左边界的地址值 + 右边界的地址值)/ 2 的向上取整,也可以是向下取整。这些东西其实对算法本身并没有影响。
但是,从遵从程序员本能的角度出发,你可以听取我的一点小建议:
-
区间应该是左开右闭的
-
为了始终维护条件 1,在循环查找的过程中,中间值地址如果赋给左边界,那么应该是向上取整。而如果是赋给右边界,则应该向下取整。
-
严谨考虑,大胆心细,不用前怕狼后怕虎。
代码
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;
}
}