给你一个整数数组 nums
和一个整数 k
,请你返回其中出现频率前 k
高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]
示例 2:
输入: nums = [1], k = 1 输出: [1]
提示:
1 <= nums.length <= 105
k
的取值范围是[1, 数组中不相同的元素的个数]
- 题目数据保证答案唯一,换句话说,数组中前
k
个高频元素的集合是唯一的
进阶:你所设计算法的时间复杂度 必须 优于 O(n log n)
,其中 n
是数组大小。
通过本题,学习了一种新的数据结构:堆
priority_queue<Type, Container, Functional>;
Type是要存放的数据类型
Container是实现底层堆的容器,必须是数组实现的容器,如vector、deque
Functional是比较方式/比较函数/优先级
priority_queue<Type>;
此时默认的容器是vector,默认的比较方式是大顶堆less<type>
代码:
class Solution {
public:
static bool cmp( pair<int,int> &a, pair<int,int> &b){
return a.second > b.second;
}
vector<int> 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& [num,count] : occurrences){
if(q.size() == k){
if(q.top().second < count){
q.pop();
q.emplace(num, count);
}
}
else{
q.emplace(num, count);
}
}
vector<int> res;
while(!q.empty()){
res.emplace_back(q.top().first);
q.pop();
}
return res;
}
};
还没好好学习堆的基础,这里就用上了,后面补。