劍指offer—數字在排序數組中出現的次數

題目:

統計一個數字在排序數組中出現的次數。

題目中看到了有序,首先應該想到的是二分查找。但是常規的二分查找用於尋找一個數,該題是用於尋找一個範圍,因爲需要尋找第一個等於目標數的數及最後一個等於目標數的數。

如何尋找第一個等於目標數的數呢?
該數左邊的數不等於目標數。

如何尋找最後一個等於目標數的數呢?
該數右邊的數不等於目標數。





public class Sword034GetNumberOfK {
    public int GetNumberOfK(int [] array , int k) {
        if(array == null || array.length == 0){
            return 0;
        }
        int start = getFirst(array,k,0,array.length - 1);
        int end = getLast(array,k,0,array.length - 1);
        if(start != -1 && end != -1){
            return end - start + 1;
        }
        return 0;
    }

    /**
     * 第一個等於k的數
     */
    public int getFirst(int[] nums, int k, int start, int end){
        int mid = (start + end)/2;
        while(start <= end){
            if(nums[mid] < k){
                start = mid + 1;
            }else if(nums[mid] > k){
                end = mid-1;
            }else{
                if(mid - 1 >= 0 && nums[mid-1] == k){
                    end = mid-1;
                }else{
                    return mid;
                }
            }
            mid = (start + end)/2;
        }
        return -1;
    }

    /**
     * 最後一個等於k的數
     */
    public int getLast(int[] nums, int k, int start, int end){
        int mid = (start + end)/2;
        while(start <= end){
            if(nums[mid] < k){
                start = mid + 1;
            }else if(nums[mid] > k){
                end = mid - 1;
            }else{
                if( mid + 1 < nums.length && nums[mid+1] == k){
                    start = mid+1;

                }else{
                    return mid;
                }
            }
            mid = (start + end)/2;
        }
        return -1;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章