剑指向offer里的一道经典题目,难度:易
描述
给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数
数据范围:0≤n≤1000,0≤k≤100,数组中每个元素的值满足 0≤val≤100
要求:空间复杂度 O(1),时间复杂度 O(logn)
解答:要找到有几个K,只需要找到最后一个K和第一个K,有几个K不就出来了吗?所以我们找出K+0.5的位置和K-0.5的位置再相减其实就是答案了。(其实不管是0.几都可以,自己对着代码思考一下)但是注意不要用K+1和K-1,因为数值有可能是重复的,你无法保证K-1就是第一个K左边的第一个数字,K+1同理。
第一步:写一个二分查找的函数
第二步:用二分法找出K+0.5和K-0.5的位置并相减
public class Solution {
//二分查找
private int bisearch(int[] data, double k){
int left = 0;
int right = data.length - 1;
//二分左右界
while(left <= right){
int mid = (left + right) / 2;
if(data[mid] < k)
left = mid + 1;
else if(data[mid] > k)
right = mid - 1;
}
return left;
}
public int GetNumberOfK(int [] array , int k) {
//分别查找k+0.5和k-0.5应该出现的位置,中间的部分就全是k
return bisearch(array, k + 0.5) - bisearch(array, k - 0.5);
}
}