剑指Offer面试题53:在排序数组中查找数字

最终找到了我的代码和答案的区别,答案是进行两个二分查找,找第一个和最后一个,然后做差,我是用一个二分查找。为全局的两个变量赋值,从逻辑上,一个二分查找一个变量,是最合理的,容易实现的,这也是我的代码繁琐的原因。

我的繁琐的代码,还不对

    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);
            }
        }
        
        
        
    }

答案代码

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);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40473204/article/details/114770384
今日推荐