//参考剑指offer思路,先找到第一个索引找到第二个索引
public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        if(array==null||array.length==0){
            return 0;
        }
        int result=0;
        if(findLast(array,0,array.length-1,k)>-1&&findFirst(array,0,array.length-1,k)>-1){
           result=findLast(array,0,array.length-1,k)-findFirst(array,0,array.length-1,k)+1;
        }
        return result;
    }

    //找到第一个索引的函数
    public static int findFirst(int[] array,int start,int end,int k){
        //边界条件
        if(start>end){
            return -1;
        }
        int midIndex=(start+end)/2;
       //中间索引值刚好等于K时
        if(array[midIndex]==k){
            //判断是第一个吗
            //这里有个坑,先判断(midIndex-1)>=0再array[midIndex-1]!=k,不然会出现数组越界
            //下同
            if(((midIndex-1)>=0&&array[midIndex-1]!=k)||midIndex==0){
                return midIndex;
            }else{
                end=midIndex-1;
            }
           //中间索引值刚好大于K时
        }else if(array[midIndex]>k){
            end=midIndex-1;
        }else{
            start=midIndex+1;
        }

        return findFirst(array,start,end,k);
    }

    //找到最后一个索引的函数
    private static int findLast(int[] array,int start,int end,int k){
        //边界条件
        if(start>end){
            return -1;
        }
        int midIndex=(start+end)/2;
        if(array[midIndex]==k){
            //判断是最后一个吗
            if(((midIndex+1)<array.length&&array[midIndex+1]!=k)||midIndex==array.length-1){
                return midIndex;
            }else{
                start=midIndex+1;
            }
        }else if(array[midIndex]<k){
            start=midIndex+1;
        }else{
            end=midIndex-1;
        }

        return findLast(array,start,end,k);
}
}

时间复杂度与二分查找的相同:O(logn)
空间复杂度为O(1)