二分查找第一个大于等于这个数的位置,然后再二分查找第一个大于这个数的位置,然后用后者减去前者。
public class Solution { public int GetNumberOfK(int [] array , int k) { if(array == null || array.length == 0) return 0; int first_bound = Find1(array, k); int second_bound = Find2(array, k); return second_bound - first_bound; } public int Find1(int[] array, int k) { int low = 0; int high = array.length - 1; while (low <= high) { int mid = low + (high - low) / 2; if(array[mid] >= k) { high = mid-1; if(high < 0 || ! (array[high] >= k)) { return mid; } } else if(array[mid] < k) { low = mid + 1; } } return low; } public int Find2(int[] array, int k) { int low = 0; int high = array.length - 1; while (low <= high) { int mid = low + (high-low) / 2; if(array[mid] > k) { high = mid - 1; if(high < 0 || !(array[high] > k)) { return mid; } } else if(array[mid] <= k) { low = mid + 1; } } return low; } public static void main(String[] args) { Solution solution = new Solution(); int array[] = new int[] { 1, 2, 2, 2, 2, 2, 3, 4 }; System.out.println(solution.GetNumberOfK(array, 5)); } }