输入:一个数组 nums 和一个整数 k
要求:返回数组中出现频率最高的 k 个元素
输出:长度为 k 的数组
思路:核心思路是数据结构的运用
用哈希表统计每个数字的出现次数,然后用一个“小顶堆”维持频次前 k 高的数字。
堆每次存 {频次, 值},堆顶永远是当前最小频次的那个,一旦堆超过 k 就弹掉堆顶。
复杂度:
时间复杂度:O(n log k)
空间复杂度:O(n)
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int,int> freq;
for (int x : nums) freq[x]++;
// 小顶堆:堆顶是当前频次最小的
priority_queue<
pair<int,int>,
vector<pair<int,int>>,
greater<pair<int,int>>
> pq;
// 遍历每个数字及其频次
for (auto &p : freq) {
pq.push({p.second, p.first}); // {频次, 数字}
if (pq.size() > k) pq.pop(); // 保持堆大小为 k
}
vector<int> ans;
while (!pq.empty()) {
ans.push_back(pq.top().second);
pq.pop();
}
return ans;
}
};
286

被折叠的 条评论
为什么被折叠?



