题目
给你一个整数数组nums和一个整数k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
进阶:你所设计算法的时间复杂度必须优于O(nlogn) ,其中n是数组大小。
思路
- 使用哈希表统计每个元素的出现次数。
- 使用一个最小堆维护当前出现次数最高的 k个元素。
- 最终从最小堆中取出这 k个元素,作为结果返回。
代码实现
#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>
using namespace std;
class Solution
{
public:
static bool cmp(pair<int, int>& m, pair<int, int>& n);
vector<int> topKFrequent(vector<int>& nums, int k);
};
//用于比较两个pair<int, int>的第二个元素(即出现次数)
bool Solution::cmp(pair<int, int>& m, pair<int, int>& n)
{
return m.second > m.second;
}
vector<int> Solution::topKFrequent(vector<int>& nums, int k)
{
// 哈希表记录元素出现的次数
unordered_map<int, int> occurrences;
for (auto& num : nums)
{
occurrences[num]++;
}
// 优先队列实现小顶堆
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);
// 遍历哈希表,将元素及其出现次数放入优先队列中
for (auto& it : occurrences)
{
int num = it.first;
int count = it.second;
if (q.size() == k)
{
if (q.top().second < count)
{
q.top();
q.emplace(num, count);
}
}
else
{
q.emplace(num, count);
}
}
// 从优先队列中取出元素,放入结果数组中
vector<int> ret;
while (!q.empty())
{
ret.push_back(q.top().first);
q.pop();
}
return ret;
}
int main() {
vector<int> nums = { 1, 1, 1, 2, 2, 3 };
int k = 1;
Solution solution;
vector<int> result = solution.topKFrequent(nums, k);
// 输出结果
cout << "前 " << k << " 个频率最高的元素是:";
for (int num : result) {
cout << num << " ";
}
cout << endl;
return 0;
}