剑指 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;
    }
}
posted @ 2022-01-18 23:15  NullPointer_C  阅读(26)  评论(0)    收藏  举报