描述
给出一个数组,就你求出出现次数最多的k个不同数字
解决
题目要求复杂度小于O(nlgn),如果用sort的话,最坏情况是O(n^2),利用堆就可以了,因为堆排序最差情况也是O(nlgn),而且对于堆,我们可以只存k个节点在堆中就好了。
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int, int> cnt;
int lenth = nums.size();
if (lenth == 0){
return nums;
}
using map_t = pair<int, int>;
for (auto it : nums){
++cnt[it];
}
priority_queue<map_t, vector<map_t>, greater<map_t>> res;
for (auto it : cnt){
res.push(map_t{it.second, it.first});
if (res.size() > k){
res.pop();
}
}
nums.clear();
while (res.size()){
map_t t = res.top();
// cout << t.first << endl;
nums.push_back(t.second);
res.pop();
}
return nums;
}
};