原题链接:347. 前 K 个高频元素
solution:
先计算每个数字出现的次数,在根据出现次数进行排序,最后输出,时间复杂度sort(nlogk),k为vector中元素个数,最坏情况nlogn,每个元素出现1次
class Solution {
public:
typedef pair<int,int> PII;
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> map;
for(auto &x : nums){
map[x]++;
}
vector<PII> vec; //将unordered_map值保存
for(auto it = map.begin();it != map.end();it++)
vec.push_back({it->first,it->second}); //first=key,second=value
sort(vec.begin(),vec.end(),[](const PII &a,const PII &b){
return a.second > b.second;
});
vector<int> res; //定义返回值
for(int i = 0;i < k;i++)
res.push_back(vec[i].first);
return res;
}
};
统计次数,再用小根堆排序
时间复杂度nlogk,k为堆大小
class Solution {
public:
typedef pair<int,int> PII;
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> map;
for(auto &x : nums){
map[x]++;
}
priority_queue<PII,vector<PII>,greater<PII>> q; //定义小根堆,默认以first排序
int i = 0;
for(auto &it : map)
{
if(i < k)
{
i++;
q.push({it.second,it.first});
}else
{
if(it.second > q.top().first)
{
q.pop();
q.push({it.second,it.first});
}
}
}
vector<int> res; //定义返回值
for(int i = 0;i < k;i++){
auto t = q.top();
res.push_back(t.second);
q.pop();
}
return res;
}
};