统计一个数字在排序数组中出现的次数。
题解:
解法1:遍历
从前往后遍历一遍,找到k开始计数为1,到不是k时终止。
时间复杂度O(n)
解法2:二分查找
找出k第一次和最后一次出现的下标,相减
时间复杂度O(lgn)
如果只查找一次,然后向左右遍历有几个,并没有改变时间复杂度,还是O(n)
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int lower = getLower(data, k);
int higher = getHigher(data, k);
//没有k的情况
if(higher >= data.size() || lower == -1) return 0;
return higher - lower + 1;
}
//获取k第一次出现的下标
int getLower(vector<int>& data, int k){
int mid, left = 0, right = data.size() - 1;
while(left <= right){
mid = left + ((right - left) >> 1);
if(data[mid] < k) left = mid + 1;
else right = mid - 1;
}
return left;
}
//获取k最后一次出现的下标
int getHigher(vector<int>& data, int k){
int mid, left = 0, right = data.size() - 1;
while(left <= right){
mid = left + ((right - left) >> 1);
if(data[mid] <= k) left = mid + 1;
else right = mid - 1;
}
return right;
}
};