要求

  • 给定一个非空数组,返回前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. rpm 和 yum 软件管理

    软件安装总结: 安装软件方式有如下几种: 方式1:编译安装 将源码程序按照需求进行先编译,后安装 缺点: 安装过程复杂,而且很慢 优点: 安装过程可控,真正的按需求进行安装(安装位置.安装的模块都可以 ...

  2. Mybatis3源码笔记(二)SqlSession

    1. 核心层次 2. SqlSession 先从顶层的SqlSession接口开始说起.SqlSession是MyBatis提供的面向用户的API,表示和数据库的会话对象,用于完成对数据库的一系列CR ...

  3. JPA简单的分页条件查询

    1,service层代码: @Override public QrCodeRecordPaging getPage(String projectId, Integer pageNumber, Inte ...

  4. MySQL中的注释符号有三种

    ①#... ②-- ... ③/*...*/ 注意事项: 其中...表示注释的文本内容 ★ 在使用-- ...注释内容时,需要在--和注释内容之间加一个空格符(如空格.tab.换行符等)

  5. BLE链路层空中包格式

    空中包格式 BLE链路层的空中包格式非常简单,它所有的空中包都遵循下图所示的格式: 有上图可见,BLE空中包由4个部分组成,他们分别是: 前导码(Preamble) 访问地址(Access Addre ...

  6. 1420. Build Array Where You Can Find The Maximum Exactly K Comparisons

    Given three integers n, m and k. Consider the following algorithm to find the maximum element of an ...

  7. Python 极速入门指南

    前言 转载于本人博客. 面向有编程经验者的极速入门指南. 大部分内容简化于 W3School,翻译不一定准确,因此标注了英文. 包括代码一共两万字符左右,预计阅读时间一小时. 目前我的博客长文显示效果 ...

  8. git平时用到的仓库

    github茫茫仓库 若水三千,取一瓢饮 doocs/technical-books doocs/leetcode lepture/editor pandao/editor.md 未完..待续!!积累 ...

  9. IE 兼容问题笔记

    IE 兼容问题笔记 解决IE11兼容HTML5 设置 document.body的一些用法以及js中的常见问题 flex布局浏览器兼容处理 ie8, ie9 css3 media媒体查询器用法总结 c ...

  10. hdu3594 强连通 tarjan

    题意: 判断是不是强连通图 ,同时每一条边必须只能在一个环里 思路:之前我的强连通用的全是双深搜,结果题目的第二个要求很难判断,一开始写了三个深搜加上并查集,结果越写越乱,其实就是在判断一个边是否只在 ...