public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        //1. 空数组特例限定
        int len = array.length;
        if(len == 0){
            return 0;
        }

        //1. 寻求左边界:即第一个等于k的元素索引
        int left = 0;
        int right = len - 1;

        while(left < right){
            //mid向下取整
            int mid = (right + left) >> 1;

            if(array[mid] < k){
                //array[mid]小于k,说明k在右侧,移动左边界至mid后一位
                left = mid + 1;
            }else{
                //等于或者大于k,说明第一个k可能在mid及其左侧,此时左边界不动,移动右边界。
                right = mid;
            }
        }
        if(array[right] != k) return 0;
        int leftEdge = right;

        //2. 寻求右边界:即最后一个等于k的元素索引
        right = len - 1;

        while(left < right){
            //mid向上取整
            int mid = (right + left + 1) >> 1;
            if(array[mid] <= k){
                left = mid;
            }else{
                right = mid - 1;
            }
        }

        if(array[right] != k) return 0;
        int rightEdge = right;

        return rightEdge - leftEdge + 1;
    }

}