力扣347:前K个高频元素
力扣347:前K个高频元素
- 题目
- 思路
- 代码
题目
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
思路
首先我们想到使用哈希表来存储每个元素的出现的次数,其次要对出现的次数进行比较很容易就能想到各种各样的排序方法,但是使用排序方法的话只要出现数组里的元素一多就有可能达到O(N)的时间复杂度。毕竟我们只要前K个高频元素,那么我们是否可以使用堆呢也就是小顶堆,小顶堆又完成了排序的工作又可以只保留前K个元素即设置堆的容量为K。
有了思路就很好写了,我们可以手撕一个小顶堆也可以使用优先队列来完成因为优先队列就是由大小顶堆为底层的。
代码
class Solution {
public://小顶堆// >号为小顶堆 <号为大顶堆static bool cmp(pair<int, int> m, pair<int, int> n) {return m.second > n.second;}vector<int> topKFrequent(vector<int>& nums, int k) {//哈希表unordered_map<int, int> mp;// 小顶堆priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);//统计并存储各元素的出现次数for (auto& ch : nums) {mp[ch]++;}for (auto& [num, count] : mp) {//如果优先队列的大小等于k了我们就需要判断//当前值出现次数和堆顶出现次数if (q.size() == k) {// 如果堆顶的出现次数小于当前出现次数// 说明我们需要pop一个再将当前值插入了if (q.top().second < count) {q.pop();q.emplace(num, count);}} else {//如果小于k那就直接插入q.emplace(num, count);}}vector<int> res;while(!q.empty()){res.push_back(q.top().first);q.pop();}return res;}
};