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

这道题的链接: 剑指 Offer 53 - I. 在排序数组中查找数字 I
这道题我们在和面试官对线时要注意,这个数据是排好序的,所以我们不能用最土的for循环遍历方法,写出来估计面试官就和你说拜拜了,我们应该使用二分法,我们可以用一个left索引和right索引来找数字target左右边界,然后一减就得到target的数量了。具体代码如下:

class Solution{
    public int search(int[] nums, int target){
        if (nums.length == 0) return 0;
        return binarySearch(nums, taget + 1) - binarySearch(nums, target);
    }
    private int binarySearch(int[] nums, int target){
        int left = 0, right = nums.length;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < target){
                left = mid + 1;
            } else {
                right = mid; 
            }
        } 
        return right;
    }
}

还有另一个代码的写法如下:

class Solution{
    public int binarySearch(int[] nums, int target){
        if(nums == null || 0 == nums.length) {
            return -1;
        }
        int r = nums.length - 1;
        int l = 0;
        int mid = (l + r) / 2;
        while(nums[mid] != target && 1 != r) {
            if (target > nums[mid]) {
                l = mid + 1; 
            } else {
                r = mid;
            }
            mid = (l + r) / 2;
        } 

        if (target == nums[mid]) {
            return mid;
        }
        return -1;
    }
}

另外一种方法就是双指针,双指针用法好广呀

class Solution {
    public int search(int[] nums, int target) {
        int res = 0;
        if(null != nums && 0 != nums.length) {
            int l = 0;
            int r = nums.length - 1;
            int mid = (l + r) / 2;
            while (nums[mid] != target && l != r){
                if (target > nums[mid]){
                    l = mid + 1;
                } else {
                    r = mid;
                }
                mid = (l + r) / 2;
            }
            if(nums[mid] == target) {
                for(int i = mid - 1 ;i >=0; --i){
                    if (targey != nums[i]) {
                        break;
                    }
                    ++res;
                }
                for (int i = mid + 1; i< nums.length; ++i){
                    if (targey != nums[i]) {
                        break;
                    }
                    ++res;    
                }
            }
        }
        return res;
    }
}