二分查找很常见,思路也很清晰。
但是还是那句经典的话: 思路越简单,细节越丰富。
二分查找 "恶心"人的地方有三个:
- while 里面是
left <= right
还是left < right
? - 缩小区间的时候,left 和 right 要不要带上mid?(最可能引起死循环的原因)
- 返回啥 ? left 还是 right ?
有时候凭感觉写的对了,有时候就错了,这就是传说中的7分天注定,3分靠感觉!
coding的最终奥义,无脑编程!
拿最常用的三个 二分查找场景:
- 寻找一个数
- 寻找一个数的最左侧出现的地方(左侧边界)
- 寻找一个数的最左侧出现的地方(右侧边界)
这三个场景其实可以抽象成两个:
- 找到这个数就返回
- 找到这个数不返回,继续往左/右找
废话不说,先上菜!
(我把所有可能产生疑问的地方标注出来单一在后面解释。)
case.1
int binary_search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left <= right) {
int mid = ((right - left) >> 1) + left;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;