Sword Finger Offer Interview Question 53: Find a number in a sorted array

Finally found the difference between my code and the answer. The answer is to perform two binary searches, find the first and last one, and then do the difference. I used one binary search. Assigning values ​​to two global variables is logically the most reasonable and easy to implement. This is why my code is cumbersome.

My cumbersome code is not right

    int start_t = 0;
    int end_t = 0;
    public int search(int[] nums, int target) {
        binarySearch(nums,0,nums.length - 1,target);
        return end_t - start_t + 1;
    }
    public void binarySearch(int[] nums, int start,int end,int target){
        int mid = (end + start)/2;
        if(mid - 1 >= 0){
            if(nums[mid] == target && nums[mid - 1] < target){
                if()
                start_t = mid;
                return ;
            }else if(nums[mid - 1] >= target && start <= mid - 1){
                binarySearch(nums,start,mid - 1,target);
            }
        }
        
        if(mid + 1 <= nums.length){
            if(nums[mid] == target && nums[mid + 1] > target){
                end_t = mid;
                return ;
            }else if(nums[mid + 1] <= target && mid + 1 <=end){
                binarySearch(nums,mid + 1,end,target);
            }
        }
        
        
        
    }

Answer code

class Solution {
    int start_t = 0;
    int end_t = 0;
    public int search(int[] nums, int target) {
        int number = 0;
        if(nums != null&& nums.length>0){
            int first = getFirstK(nums,nums.length, 0,nums.length-1,target);
            int last = getLastK(nums,nums.length, 0,nums.length-1,target);
            if(first > -1 && last > -1){
                number = last - first +1;
            }
        }
        return number;
    }
    public int getFirstK(int[] data,int length, int start,int end,int k){
        if(start > end)
            return -1;
        int mid = (end + start)/2;
        int middleDate = data[mid];

        if(middleDate == k){
            if((mid > 0&& data[mid - 1]!=k) || mid == 0)
                return mid;
            else
                end = mid - 1; 
        }else if(middleDate > k)
            end = mid - 1;
        else
            start = mid + 1;
        
        return getFirstK(data,length, start,end,k);
    }

    public int getLastK(int[] data,int length, int start,int end,int k){
        if(start > end)
            return -1;
        int mid = (end + start)/2;
        int middleDate = data[mid];

        if(middleDate == k){
            if((mid < length - 1&& data[mid + 1]!=k )|| mid == length - 1)
                return mid;
            else
                start = mid + 1; 
        }else if(middleDate < k)
            start = mid + 1;
        else
            end = mid - 1;
        
        return getLastK(data,length, start,end,k);
    }
}

 

 

Guess you like

Origin blog.csdn.net/qq_40473204/article/details/114770384