先用二分查找定位到目标值k的位置,再以k的位置索引为原点向两边搜索k的个数😁
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if (array.length == 0) return 0;
return this.binarySearch(array,0,array.length-1,k);
}
private static int binarySearch(int[] array,int left,int right,int k) {
if (left > right) return 0;
int mid = (left + right) / 2;
int minVal = array[mid];
int count = 0;
if (k < minVal) {
return binarySearch(array,left,mid-1,k);
} else if (k > minVal) {
return binarySearch(array,mid+1,right,k);
} else {
// 当k==minVal时,再向左和向右寻找k的个数
int leftMid = mid;
int rightMid = mid+1;
// 向左(前提:使用”&&“运算符保证下标不越界)
while (leftMid >= 0 && k == array[leftMid]) {
count++;
leftMid--;
}
// 向右
while (rightMid <= array.length-1 && k == array[rightMid] ) {
count++;
rightMid++;
}
return count;
}
}
} 
京公网安备 11010502036488号