ソードフィンガーオファーインタビュー質問53:ソートされた配列で番号を見つける

私はついに自分のコードと答えの違いを見つけました。答えは、2つのバイナリ検索を実行し、最初と最後の検索を見つけてから、違いを実行することです。1つのバイナリ検索を使用しました。2つのグローバル変数に値を割り当てることは、論理的に最も合理的で実装が簡単です。これが私のコードが面倒な理由です。

私の面倒なコードは正しくありません

    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