统计一个数字在排序数组中出现的次数。
例如输入排序数组 [1,2,3,3,3,3,4,5] 和数字 3,由于 3 在这个数组中出现了 4 次,因此输出 4。
样例
输入:[1, 2, 3, 3, 3, 3, 4, 5] , 3
输出:4
暴力:O(n)
class Solution {
public:
int getNumberOfK(vector<int>& nums , int k) {
int res = 0;
for(auto x : nums)
if(x == k) res++;
return res;
}
};
二分(logn):
如果有解,那么二分找到k第一次出现在左边的位置和第一次出现在右边的位置;
class Solution {
public:
int getNumberOfK(vector<int>& nums , int k) {
int l = 0, r = nums.size() - 1;
while(l < r){
int mid = l + r + 1>> 1;
if(nums[mid] <= k) l = mid;
else r = mid - 1;
}
if(!nums.size() || nums[l] != k) return 0;
int right = l;
l = 0, r = nums.size() - 1;
while(l < r){
int mid = l + r >> 1;
if(nums[mid] >= k) r = mid;
else l = mid + 1;
}
return right - l + 1;
}
};