public int GetNumberOfK(int [] array , int k) {
if(array==null||array.length==0) return 0;
//有序,想到二分,如何用二分来优化?
//这是数组,如何确定某个数的个数?
//由于有序,所以这个数出现的位置肯定是连续的,数组的好处在于下标,所以找到上下边界就可以使用下标
//直接算出个数
//上界:>=k的最左边,同样也是<k的最右边+1
//下界:<=k的最右边
//所以整一个函数,求<=k的最右边(leftEqlMaxRight)就可以了
int res = leftEqlMaxRight(array,k) - leftEqlMaxRight(array,k-1);
return res<0?0:res;//左边为负才需要管(没有k在数组中),右边为负没关系,表示0位置是k而已
}
public int leftEqlMaxRight(int[] array,int k){
int l = 0;
int r = array.length - 1;
int target = -1;
while(l<=r){
int mid = ((r-l)>>>1)+l;
if(array[mid]<=k){
//标记,向右继续找
target = mid;
l = mid + 1;
}else{
r = mid - 1;
}
}
return target;
}