要求

  • 给定一个非空数组,返回前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

最新文章

  1. markdown编辑器
  2. json 递归查找某个节点
  3. AppStore 内购验证的方法
  4. 如何删除docker images/containers
  5. 安装xampp后,遇到的各种问题
  6. PHPExcel操作sae的storage上的文件
  7. WebService只能在本地使用,无法通过网络访问的解决办法
  8. JSOI2008最大数(线段树)
  9. Easy Climb
  10. JS高程5.引用类型(6)Array类型的位置方法,迭代方法,归并方法
  11. 用 Python 脚本实现对 Linux 服务器的网卡流量监控
  12. Lambda表达式效率问题
  13. 开篇-我眼中的FPGA
  14. 【转】理解WebKit和Chromium: JavaScript引擎简介
  15. ln 链接命令 简要说明 软硬链接关系说明
  16. 服务器上的XML
  17. JS加载获取父窗体传递的参数
  18. P1280 尼克的任务 线性DP
  19. C语言学习 - 字节对齐
  20. Vue(六):条件与循环

热门文章

  1. Springboot进行Http接口交互实现邮件告警
  2. 201871030119-马桂婷 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
  3. 史上最全jdk新特性总结,涵盖jdk8到jdk15!
  4. Sentinel上生产环境只差一步,监控数据持久化
  5. 自定义grub主题
  6. S-Trees UVA - 712
  7. Java | 使用OpenFeign管理多个第三方服务调用
  8. 数据结构(5):Java实现二叉树
  9. 02- Python的版本
  10. Nginx 配置浏览Linux 系统目录并下载文件