题目描述
给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数
示例1:
输入
[1,2,3,3,3,3,4,5],3
返回值
4
思路:
解题思路:
题目说的在升序数组找到一个目标,然后统计这个目标出现的次数,我们要好好利用升序数组这个条件。
有了这个条件,我们就可以算出这个目标值的左边界还有右边界,然后取两者之差即可统计出这个目标出现的次数。
因为我们要找到目标值的左边界和右边界,我们很容易能想到用二分查找去求。
那么,找出左边界其实很好找,那要怎么找到右边界呢,我们可以将右边界转化为求比目标值大的数的左边界来求。
也就是说,我们如果要 求数字
4
的右边界,那我们其实可以求数字5
的左边界然后也就知道了4的右边界了。
public int getNumberOfK(int [] nums , int k) {
//找到左边界
int first = binarySearch(nums,k);
//找到右边界,将右边界转化为求比目标值大的数的左边界来求。
int last = binarySearch(nums,k+1);
return (first==nums.length || nums[first] !=k) ? 0 : (last-first);
}
public int binarySearch(int[] nums, int k){
if(nums == null)
return 0;
int l = 0,r = nums.length - 1;
while(l <=r ){
int m = l + (r-l)/2;
if(nums[m] < k){
l = m + 1;
}
else{
r = m - 1;
}
}
return l;
}