题目描述
统计一个数字在排序数组中出现的次数。
方法一:暴力方法
查找数组中某个目标,不管数组是否有序,直接遍历一遍即可。
代码:
class Solution {
public:
int GetNumberOfK(vector<int> nums ,int k) {
int ret = 0;
for (int val : nums) {
if (val == k)
++ret;
}
return ret;
}
};
时间复杂度:O(N)
空间复杂度:O(1)
方法二:二分查找
代码为:
class Solution {
public:
//在排序序列中使用二分查找法可以将时间复杂度优化到O(log N));
int GetNumberOfK(vector<int> data ,int k) {
int lbound=0,rbound=0;
int l=0,r=data.size();
while(l<r){
int mid=l+((r-l)>>1);
if(data[mid]<k){
l=mid+1;//找到目标数字的下界,即目标值的第一个,如果目标值不存在,则是第一个比它大的
}else{
r=mid;
}
}
lbound=l;
l=0,r=data.size();
while(l<r){
int mid=l+((r-l)>>1);
if(data[mid]<=k){
l=mid+1;//找到第一个比目标值大的上界
}else{
r=mid;
}
}
rbound=r;
return rbound-lbound;//上界减去下界即为该数字出现的次数
}
};
我们也可以直接用STL中的upper_bound(), lower_bound()库函数
代码如下:
class Solution {
public:
//最简洁的方法是使用STL自带的求上下界的库函数
int GetNumberOfK(vector<int> data ,int k) {
return upper_bound(data.begin(),data.end(),k)-lower_bound(data.begin(),data.end(),k);
}
};
时间复杂度:O(logN)
空间复杂度:O(1)