题目
给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
提示:
1 <= nums.length <= 105
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的
解法1:优先队列
在题目中,需要返回出现频率前k高的元素,因此需要首先统计出元素出现的个数,此时需要遍历数组数据,并通过哈希表保存数据。然后基于优先队列保存出现频率前k高的元素,最终得出结果。代码如下:
class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
// 基于哈希表统计元素出现的个数
unordered_map<int, int> count_buffer{};
for (auto val : nums) {
++count_buffer[val];
}
class compare {
public:
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second > rhs.second;
}
};
// 创建优先队列,其中元素的比较表达式基于自定义的compare类,并且重载实现()操作符
priority_queue<pair<int, int>, vector<pair<int, int>>, compare> buffer{};
for (const auto& item : count_buffer) {
if (buffer.size() < k) {
buffer.emplace(item);
continue;
}
if (compare()(item, buffer.top())){
buffer.pop();
buffer.emplace(item);
}
}
vector<int> result{};
while (!buffer.empty()) {
result.push_back(buffer.top().first);
buffer.pop();
}
return result;
}
};
时间复杂度为O(nlogk)
,n为数据集合大小,k为优先队列中元素个数,空间复杂度为O(n)
,执行结果如下: