数字在排序数组中出现的次数 --剑指offer
二分法查找k的位置 然后往前往后遍历。
或者找到第一个k和最后一个k的位置 然后相减 也是用二分查找 只不过在找到k的时候先判断k的前后是不是k 是的话不返回 继续缩小范围 直到确定这个是边上的
public class Solution { public int GetNumberOfK(int [] array , int k) { if(array.length == 0 || array == null){ return 0; } int result=find(array,0,array.length-1,k); int count=0; if(result >= 0){ count =1; int i=result,j=result; while (i>=1 && array[i] == array[i-1]){ count ++; i --; } while (j < array.length-1 && array[j] == array[j+1]){ count ++; j ++; } } return count; } private int find(int[] array, int left, int right, int k) { int mid=0; while (left <= right){ mid=(left+right)>>1; if(array[mid] < k){ left=mid+1; }else if (array[mid] > k){ right = mid-1; }else { return mid; } } return -1; } }
二分查找的算法: