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

理解好二分法。

利用两次二分法,寻找左右边界,相减。

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

class Solution {
    public int search(int[] nums, int target) {
        int i = 0, j = nums.length - 1;
        int res = 0;
        //二分法寻找右边界
        /*首先分析while(i <= j)为什么需要等号
        * 判断等于的时候,正常情况循环跑完必定j在i左边1位
        * 找右边界的话,相等就往右靠,即i = mid + 1
        * 找左边界的话,相等就往左靠,即j = mid - 1
        */
        while(i <= j){
            int mid = (i + j) / 2;
            if(nums[mid] <= target)
                i = mid + 1;
            else
                j = mid - 1;
        }
        int right = i;

        //二分法寻找左边界
        i = 0; j = nums.length - 1;
        while(i <= j) {
            int mid = (i + j) / 2;
            if(nums[mid] < target) 
                i = mid + 1;
            else 
                j = mid - 1;
        }
        int left = j;

        //1 2 2 2 3
        //右边界下标为4,左边界下标为0
        return right - left - 1;
    }
}

 

posted @ 2021-03-25 16:41  星予  阅读(18)  评论(0编辑  收藏  举报