博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Top K Frequent Elements 前K个高频元素
阅读量:6239 次
发布时间:2019-06-22

本文共 1694 字,大约阅读时间需要 5 分钟。

 

Given a non-empty array of integers, return the k most frequent elements.

Example 1:

Input: nums = [1,1,1,2,2,3], k = 2Output: [1,2]

Example 2:

Input: nums = [1], k = 1Output: [1]

Note:

  • You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
  • Your algorithm's time complexity must be better than O(n log n), where n is the array's size.

 

这道题给了我们一个数组,让我们统计前k个高频的数字,那么对于这类的统计数字的问题,首先应该考虑用HashMap来做,建立数字和其出现次数的映射,然后再按照出现次数进行排序。我们可以用堆排序来做,使用一个最大堆来按照映射次数从大到小排列,在C++中使用priority_queue来实现,默认是最大堆,参见代码如下:

 

解法一:

class Solution {public:    vector
topKFrequent(vector
& nums, int k) { unordered_map
m; priority_queue
> q; vector
res; for (auto a : nums) ++m[a]; for (auto it : m) q.push({it.second, it.first}); for (int i = 0; i < k; ++i) { res.push_back(q.top().second); q.pop(); } return res; }};

 

当然,既然可以使用最大堆,还有一种可以自动排序的数据结构TreeMap,也是可以的,这里就不写了,因为跟上面的写法基本没啥区别,就是换了一个数据结构。

我们还可以使用桶排序,在建立好数字和其出现次数的映射后,我们按照其出现次数将数字放到对应的位置中去,这样我们从桶的后面向前面遍历,最先得到的就是出现次数最多的数字,我们找到k个后返回即可,参见代码如下:

 

解法二:

class Solution {public:    vector
topKFrequent(vector
& nums, int k) { unordered_map
m; vector
> bucket(nums.size() + 1); vector
res; for (auto a : nums) ++m[a]; for (auto it : m) { bucket[it.second].push_back(it.first); } for (int i = nums.size(); i >= 0; --i) { for (int j = 0; j < bucket[i].size(); ++j) { res.push_back(bucket[i][j]); if (res.size() == k) return res; } } return res; }};

 

类似题目:

 

参考资料:

  

转载地址:http://erbia.baihongyu.com/

你可能感兴趣的文章
java枚举分析
查看>>
JAVA线程异常终止
查看>>
dede 伪静态
查看>>
linux里source、sh、bash、./有什么区别
查看>>
windows安装MongoDB
查看>>
Silverlight4 Framework 之困局
查看>>
最小二乘法之一元线性拟合
查看>>
wordpress如何添加调用侧边栏小工具功能
查看>>
ffmpeg 屏幕录像
查看>>
mapreduce如何调用第三方jar包
查看>>
Java编码风格
查看>>
Spring MVC防御CSRF、XSS和SQL注入攻击
查看>>
gcc命令使用记录
查看>>
下载网络文件HttpURLConnection.getContentLength()大小为 -...
查看>>
linux文件设备与I/O:read/write函数 与 阻塞 Block
查看>>
在Tomcat中部署Web程序的几种方式
查看>>
javascript常用命令
查看>>
Cocos2d-X游戏开发(一):搭建Cocos2d-X开发环境
查看>>
Linux: devfs, devtmpfs and udev
查看>>
nginx 日志切割
查看>>