數字在排序陣列中出現的次數 java
阿新 • • 發佈:2019-01-05
題目:統計一個數字在排序陣列中出現的次數。例如輸入排序陣列{1,2,3,3,3,3,4,5}和數字3,由於3在這個陣列中出現了4次,因此輸出4.
思路:
用二分查詢,分別找出第一個3,和最後一個3的位置,然後計算個數。
時間複雜度O(logn)
程式碼:
package niuke.easy; public class GetNumberOfK { public static void main(String[] args) { } /** * 題目描述 統計一個數字在排序陣列中出現的次數。 <br/> * 解題思路 陣列是排序的,所以重複出現的數字是相鄰排列的。 用二分查詢演算法,找到第一次出現的位置,和 最後一次出現的位置。 * 判斷第一次出現的位置條件為:當前數字的前一個是否與之相等,若是則繼續查詢,否則該位置就是第一次出現的位置。 * 判斷最後一次出現的位置條件為:當前數字的後一個是否與之相等,若是則繼續查詢,否則該位置就是最後一次出現的位置。 出現的次數= last - * first +1 * 時間複雜度:O(logn) * * @param array * @param k * @return */ public int GetNumberOfK(int[] array, int k) { int result = 0; if (array == null || array.length == 0) { return 0; } int start = 0, end = array.length - 1; int firstIndex = getFirstIndex(array, start, end, k); int lastIndex = getLastIndex(array, start, end, k); if (firstIndex > -1 && lastIndex > -1) { result = lastIndex - firstIndex + 1; } return result; } private int getLastIndex(int[] array, int start, int end, int k) { if (start > end) { return -1; } int midIndex = (start + end) / 2; int midData = array[midIndex]; if (midData == k) { if (midIndex < array.length - 1 && array[midIndex + 1] != k || midIndex == array.length - 1) { return midIndex; } else { start = midIndex + 1; } } else if (midData > k) { end = midIndex - 1; } else { start = midIndex + 1; } return getLastIndex(array, start, end, k); } private int getFirstIndex(int[] array, int start, int end, int k) { if (start > end) { return -1; } int midIndex = (start + end) / 2; int midData = array[midIndex]; if (midData == k) { if (midIndex > 0 && array[midIndex - 1] != k || midIndex == 0) { return midIndex; } else { end = midIndex - 1; } } else if (midData > k) { end = midIndex - 1; } else { start = midIndex + 1; } return getFirstIndex(array, start, end, k); } }