对于初学者来说,二分查找看着简单,但是很容易写错,有的人甚至写十遍二分查找,九遍都不一样,,
二分法的本质不是单调性,有单调性一定可以二分,但有的没有单调性也可以二分,如Leetcode [540]有序数组中的单一元素 就是利用奇偶性二分
模板:
划分区间 [ l , mid ] 和 [ mid + 1 , r ]。
如果数组中没有找到的元素,最后指向 大于`target`的最小元素
//最后 nums[l] >= target
int search(int[] nums, int target){
int l = 0, r = nums.length-1;
while(l < r){
int mid = (r-l >> 1) + l;
if(target <= nums[mid]){
r = mid;
}else {
l = mid + 1;
}
}
return l;
}
划分区间 [ l , mid - 1 ] 和 [ mid , r ]。
如果数组中没有找到的元素,最后指向 小于`target`的最大元素
//最后 nums[l] <= target
int search(int[] nums, int target){
int l = 0, r = nums.length-1;
while(l < r){
int mid = (r-l+1 >> 1) + l;
if(target >= nums[mid]){
l = mid;
}else (target < nums[mid]){
r = mid - 1;
}
}
return l;
}
总结做二分查找问题:
- 注意中间过程释放溢出。
- 要知道如果没有找到结果,最后 l r 会指向那。