[刷题] 347 Top K Frequent Elements
2024-09-08 10:34:13
要求
- 给定一个非空数组,返回前k个出现频率最高的元素
示例
- [1,1,1,2,2,3], k=2
- 输出:[1,2]
思路
- 出队逻辑,普通队列是先进先出,优先队列是按最大/最小值出队
- 通过堆实现优先队列,C++中用 priority_queue<Type, Container, Functional>
- 扫描一遍统计频率,排序找前k个出现频率最高的元素(nlogn)
- 维护一个含有k个元素的优先队列,遍历到的元素比队列中的最小频率元素的频率高,则取出最小频率的元素,将新元素入队(nlogk)
实现
- 扫描数组,用 unordered_map 统计频率
- 维护k个元素的优先队列,priority_queue<类型,容器,比较方式>,其中数据类型为pair<频率,元素>
- 对于pair默认先比较第一个元素,第一个元素相等再比较第二个
1 class Solution {
2 public:
3 vector<int> topKFrequent(vector<int>& nums, int k) {
4 assert( k > 0 );
5
6 unordered_map<int ,int > freq;
7 for( int i = 0 ; i < nums.size() ; i ++ )
8 freq[nums[i]] ++;
9 assert( k <= freq.size() );
10
11 // 优先队列中,数据对是(频率,元素)的形式
12 priority_queue< pair<int,int> , vector<pair<int,int>>, greater<pair<int,int>>> pq;
13 for( unordered_map<int,int>::iterator iter = freq.begin() ;
14 iter != freq.end() ; iter ++){
15 if(pq.size() == k ){
16 if( iter->second > pq.top().first){
17 pq.pop();
18 pq.push( make_pair( iter->second, iter->first ) );
19 }
20 }
21 else
22 pq.push( make_pair( iter->second, iter->first ) );
23 }
24
25 vector<int> res;
26 while( !pq.empty() ){
27 res.push_back( pq.top().second );
28 pq.pop();
29 }
30 return res;
31 }
32 };
相关
- 23 Merge k Sorted Lists
参考
- c++优先队列(priority_queue)用法详解
- https://www.cnblogs.com/huashanqingzhu/p/11040390.html
最新文章
- markdown编辑器
- json 递归查找某个节点
- AppStore 内购验证的方法
- 如何删除docker images/containers
- 安装xampp后,遇到的各种问题
- PHPExcel操作sae的storage上的文件
- WebService只能在本地使用,无法通过网络访问的解决办法
- JSOI2008最大数(线段树)
- Easy Climb
- JS高程5.引用类型(6)Array类型的位置方法,迭代方法,归并方法
- 用 Python 脚本实现对 Linux 服务器的网卡流量监控
- Lambda表达式效率问题
- 开篇-我眼中的FPGA
- 【转】理解WebKit和Chromium: JavaScript引擎简介
- ln 链接命令 简要说明 软硬链接关系说明
- 服务器上的XML
- JS加载获取父窗体传递的参数
- P1280 尼克的任务 线性DP
- C语言学习 - 字节对齐
- Vue(六):条件与循环