剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I

寻找数字左边界的二分,这里需要注意r和check函数的设置,这里选择的是不可以取到的r,即nums.length。
check的退出添加也是l < r。即l >= r时。
那么对于每个check,我们最终要得到的数字的左边界,如果nums[mid] < target,可以确定此时的mid不是要取得的target左边界,故而将l置为mid + 1。
若nums[mid] >= target,可以确定此时的mid在我们要求的左边界的右边或是在左边界上,故而右边界不移动, r置为此处,直到找到了左边界。
class Solution {
public int search(int[] nums, int target) {
int l = 0, r = nums.length;
while(l < r) {
int mid = ((l + r) >> 1);
if(nums[mid] < target) {
l = mid + 1;
} else {
r = mid;
}
}
int ans = 0;
for(int i = l; i < nums.length; i++) {
if(nums[i] == target) ans++;
else break;
}
return ans;
}
}

浙公网安备 33010602011771号