思路
题目最终需要返回的是前 k 个频率最大的元素,可以想到借助堆这种数据结构,对于 k频率之后的元素不用再去处理,进一步优化时间复杂度。
具体操作为:
- 借助 哈希表 来建立数字和其出现次数的映射,遍历一遍数组统计元素的频率
- 维护一个元素数目为 k的** 最小堆**
- 每次都将新的元素与堆顶元素(堆中频率最小的元素)进行比较
- 如果新的元素的频率比堆顶端的元素大,则弹出堆顶端的元素,将新的元素添加进堆中
- 最终,堆中的 k 个元素即为前 k个高频元素
时间复杂度
代码
class Solution {
public:
struct cmp{
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second > rhs.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
map<int, int>m;
//利用哈希表记录每个整数出现的次数
for(int i=0;i<nums.size();++i)
m[nums[i]]++;
//建立小顶堆
priority_queue<pair<int, int>,vector<pair<int, int>>,cmp> que;
for(map<int, int>::iterator it=m.begin();it!=m.end();++it)
{
que.push(*it);
if(que.size()>k) que.pop();
}
//返回结果
vector<int>result;
for(int i=k-1;i>=0;--i)
{
result.push_back(que.top().first);
que.pop();
}
return result;
}
};