要求

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

[刷题] 347 Top K Frequent Elements的更多相关文章

  1. C#版(打败99.28%的提交) - Leetcode 347. Top K Frequent Elements - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  2. 347. Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

  3. [leetcode]347. Top K Frequent Elements K个最常见元素

    Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...

  4. 347. Top K Frequent Elements (sort map)

    Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...

  5. [LeetCode] 347. Top K Frequent Elements 前K个高频元素

    Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...

  6. 347. Top K Frequent Elements 最常用的k个元素

    [抄题]: Given a non-empty array of integers, return the k most frequent elements. For example,Given [1 ...

  7. 【LeetCode】347. Top K Frequent Elements 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 解题方法 字典 优先级队列 日期 题目地址:https://l ...

  8. LeetCode 【347. Top K Frequent Elements】

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

  9. Leetcode 347. Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

随机推荐

  1. Spring Boot MVC 单张图片和多张图片上传 和通用文件下载

    @Autowired private ServerConfig serverConfig; /** * 通用下载请求 * * @param fileName 文件名称 * @param delete ...

  2. [树状数组]数星星 Stars

    数 星 星 S t a r s 数星星 Stars 数星星Stars 题目描述 天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标.如果一个星星的左下方(包含正左和正下)有 k k k 颗星星 ...

  3. docker部署skywalking

    https://www.cnblogs.com/xiao987334176/p/13530575.html

  4. CSS3新增了哪些新特性

    一.是什么 css,即层叠样式表(Cascading Style Sheets)的简称,是一种标记语言,由浏览器解释执行用来使页面变得更为美观 css3是css的最新标准,是向后兼容的,CSS1/2的 ...

  5. SparkStreaming使用mapWithState时,设置timeout()无法生效问题解决方案

    前言 当我在测试SparkStreaming的状态操作mapWithState算子时,当我们设置timeout(3s)的时候,3s过后数据还是不会过期,不对此key进行操作,等到30s左右才会清除过期 ...

  6. 带你全面认识CMMI V2.0(三)——实践域

    实践域以往被称为称为"过程域",如:配置管理,现在叫做"实践域".对于2.0版,则有25个适用的实践域.与以前版本的CMMI模型一样,"实践域&quo ...

  7. 201871030108-冯永萍 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    实验三 软件工程结对项目 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs ...

  8. 201871030135-姚辉 实验二 个人项目—《D{0-1} KP》项目报告

    项目 内容 课程班级博客链接 课程班级博客链接 这个作业要求链接 这个作业要求链接 我的课程学习目标 (1)掌握软件项目个人开发流程.(2)掌握Github发布软件项目的操作方法. 这个作业在哪些方面 ...

  9. 【CTF】图片隐写术 · 盲水印

    前言 盲水印同样是CTF Misc中极小的一个知识点,刚刚做到一题涉及到这个考点的题目. 感觉还挺有意思的,就顺便去了解了下盲水印技术. 数字水印 数字水印(Digital Watermark)一种应 ...

  10. buuctf --pwn part2

    pwn难啊! 1.[OGeek2019]babyrop 先check一下文件,开启了NX 在ida中没有找到system.'/bin/sh'等相关的字符,或许需要ROP绕过(废话,题目提示了) 查看到 ...