1. 程式人生 > >劍指offer-37:數字在排序陣列中出現的次數

劍指offer-37:數字在排序陣列中出現的次數

題目描述

統計一個數字在排序陣列中出現的次數。如{1,2,3,3,3,3,4,5}和3,輸出4。

思路

看見有序,肯定就是二分查找了,演算法比較簡單,不多說,值得一提的是,不要拘泥於遞迴,要會迴圈寫法。

程式碼

public class Solution37 {


    public int GetNumberOfK(int[] array, int k) {
        int length = array.length;
        if (length == 0) {
            return 0;
        }
        int
firstK = getFirstK(array, k, 0, length - 1); int lastK = getLastK(array, k, 0, length - 1); if (firstK != -1 && lastK != -1) { return lastK - firstK + 1; } return 0; } //遞迴寫法 private int getFirstK(int[] array, int k, int start, int end) { if
(start > end) { return -1; } int mid = (start + end) >> 1; if (array[mid] > k) { return getFirstK(array, k, start, mid - 1); } else if (array[mid] < k) { return getFirstK(array, k, mid + 1, end); } else if (mid -
1 >= 0 && array[mid - 1] == k) { return getFirstK(array, k, start, mid - 1); } else { return mid; } } //迴圈寫法 private int getLastK(int[] array, int k, int start, int end) { int length = array.length; int mid = (start + end) >> 1; while (start <= end) { if (array[mid] > k) { end = mid - 1; } else if (array[mid] < k) { start = mid + 1; } else if (mid + 1 < length && array[mid + 1] == k) { start = mid + 1; } else { return mid; } mid = (start + end) >> 1; } return -1; } public static void main(String[] args) { BeanUtil.print(new Solution37().GetNumberOfK(new int[]{1, 2, 3, 3, 3, 3, 5}, 3)); } }