题目描述
统计一个数字在升序数组中出现的次数。
示例1
输入
[1,2,3,3,3,3,4,5],3
返回值
4
解题思路
二分查找算法的变形
先找出中间坐标mid,判断array[mid]与key的大小
array[mid]>key:再去左边找
array[mid]<key:再去右边找
重点分析array[mid]=key的情况
这种情况下:它的左边和右边都有可能等于key的值
他们我们依次让左边坐标加一和右边坐标减一。直到左边和右边的元素都等于key。此时就可以利用下标直接计算出一共多少个key
要注意的特殊情况有两种:
如果数组长度为0,则返回0
当我们没找到元素时,也要返回0.要最后返回时分开考虑
java代码实现
10ms 9688kb

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        if(array.length==0) return 0;//数组为空,直接返回
        int left=0;
        int right=array.length-1;
        while(left<right){
            int mid=left+(right-left)/2;
            if(array[mid]<k){
                left=mid+1;//去右边找
            }
            else if(array[mid]>k){
                right=mid-1;//去左边找
            }
            else{
                if(array[left]<k) left++;//左下标右移
                if(array[right]>k) right--;//右下标左移
                if(array[left]==k && array[right]==k) break;//全部是key是退出循环
            }
        }
        if(array[left]==k){//确认全部是key的情况,否则就是没找到返回0
            return right-left+1;
        }
        return 0;
    }
}