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; }