澄清
二分思路不难,但是我在处理细节,即左边界右边界mid值计算的时候,我总是不确定,容易漏选答案和无限循环,特此澄清
我参考了这个链接
正常的二分查找
1 2 3 4 5
这样的序列最简单,即已经排好序,而且无重复值,就是最简单的二分
查找左边界
1 2 3 3 3 5 6
如果我们target是3 ,找这个的左边界,应该找到的是第一个3,即index为2的值,这需要我们找到等于target值的时候还要继续向左找。
private int searchRangeLeft(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
while (left < right){
int mid = left +((right-left)>>1); //中间偏左
if (nums[mid] >= target){ //就算是等于我也得继续往左找
right = mid;
}else {
left = mid+1;
}
}
return nums[left] == target? left: -1;//这个时候应该是left = right
}
while (left < right){}
这个判断条件不会出现left > right
因为mid是靠左的,如果只有两个值,mid是等于left的
right = mid 而不是right-1
left+1只可能是等于right,不可能大于right
查找右边界
同样的思路,只是
- mid尽量往有靠
- 应该是mid 小于等于target,都应该往右走
private int searchRangeRight(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
while (left < right){
int mid = left +((right-left+1)>>1); //中间偏右
if (nums[mid] <= target){ //就算是等于我也得继续往右找
left = mid;
}else {
right = mid-1;
}
}
return nums[left] == target? left: -1;
}