Sword Finger Offer Interview Question 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