劍指Offer學習-面試題53:在排序數組中查找數字

	/**
     * 在排序數組中查找數字
     * 統計一個數字在排序數組中出現的次數
     *
     * @param arr
     * @return
     */
    public int getNumberOfK(int[] arr, int k) {
        if (null == arr || 0 == arr.length) return 0;
        int first = getFirstIndex(arr, k);
        int last = getLastIndex(arr, k);
        if (first == -1 && last == -1) return 0;
        return last - first + 1;
    }

    /**
     * 獲取k第一次出現的位置
     *
     * @param arr
     * @param k
     * @return
     */
    private int getFirstIndex(int[] arr, int k) {
        int left = 0;
        int right = arr.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (arr[mid] > k) {
                right = mid - 1;
            } else if (arr[mid] < k) {
                left = mid + 1;
            } else {
                if (mid == 0 || arr[mid - 1] != k) return mid;
                right = mid - 1;
            }
        }
        return -1;
    }

    /**
     * 獲取k最後一次出現的位置
     *
     * @param arr
     * @param k
     * @return
     */
    private int getLastIndex(int[] arr, int k) {
        int left = 0;
        int right = arr.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (arr[mid] > k) {
                right = mid - 1;
            } else if (arr[mid] < k) {
                left = mid + 1;
            } else {
                if (mid == arr.length - 1 || arr[mid + 1] != k) return mid;
                left = mid + 1;
            }
        }
        return -1;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章