二分查找mid取值问题
在查找第一个等于target或者最后一个target的问题中
如果左边界更新为mid,即left = mid时,mid应该取(l + r + 1) >> 1
否则应该取(l + r) >> 1
Java模板:
寻找第一个
int l = 0;
int r = nums.length - 1;
while(l < r){
int mid = l + (r - l >> 1);
if(nums[mid] >= target) //向左找
r = mid;
else // 向右找
l = mid + 1;
}
查找最后一个
int l = 0;
int r = nums.length - 1;
while(l < r){
int mid = l + (r + 1 - l >> 1);
if(nums[mid] <= target) //向右找
l = mid;
else // 向右找
r = mid - 1;
}

浙公网安备 33010602011771号