题目描述
统计一个数字在排序数组中出现的次数。
解题方案
1.排序数组可以直接使用二分查找,统计次数,但是比较慢
2.STL中的一些库函数
代码
Python版本和开挂一样
return data.count(k)
实现了这些二分查找的两个版本lower_bound
,upper_bound
,直接调用就好了。O(log n)
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
return upper_bound(data.begin(), data.end(), k) - lower_bound(data.begin(), data.end(), k);
}
};
equal_range
这个函数,用于查找一个有序序列中值相等的一部分的范围
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
auto resultPair = equal_range(data.begin(), data.end(),k);
return resultPair.second - resultPair.first;
}
};
//因为data中都是整数,所以可以稍微变一下,不是搜索k的两个位置,而是搜索k-0.5和k+0.5
//这两个数应该插入的位置,然后相减即可。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
return biSearch(data, k+0.5) - biSearch(data, k-0.5) ;
}
private:
int biSearch(const vector<int> & data, double num){
int s = 0, e = data.size()-1;
while(s <= e){
int mid = (e - s)/2 + s;
if(data[mid] < num)
s = mid + 1;
else if(data[mid] > num)
e = mid - 1;
}
return s;
}
};
//循序查找O(n)
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
//单纯的利用了count函数。。。。。
return count(data.begin(),data.end(),k);
}
};
//利用STL的multimap容器底层以红黑树为基础,构造成本O(n),查询成本O(log n)
int GetNumberOfK(vector<int> data, int k) {
multiset<int> msData(data.begin(), data.end());
return msData.count(k);
}