1. 具体题目

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例 1:  输入: nums = [1,1,1,2,2,3], k = 2  输出: [1,2]

示例 2:  输入: nums = [1], k = 1  输出: [1]

2. 思路分析

首先需要统计数组中各不同元素的出现频率,将其存入哈希表中。之后应将元素按照出现的频率排序,取频率最高的前 k 个元素。为了省去排序的时间,考虑创建一个数组将元素填入,该数组下标为元素的出现频率。由于可能存在出现频率相同的元素,所以将数组元素设置为一个列表,形象地说,就是设置若干个桶,每个桶存储出现频率相同的数。最后倒序遍历该数组,取出前 k 个元素作为结果返回。

3. 代码

 public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer,Integer> map = new HashMap<>();
for(int num : nums){
map.put(num, map.getOrDefault(num, 0) + 1);
}
//桶排序
List<Integer>[] buckets = new ArrayList[nums.length + 1];
for(int key : map.keySet()){
int frequency = map.get(key); //元素出现的频率
if(buckets[frequency] == null){
buckets[frequency] = new ArrayList<>();
}
buckets[frequency].add(key); //出现频率相同的元素存入同一个桶中
}
//倒序遍历数组,取倒数的前 k 个元素
List<Integer> ans = new ArrayList<>();
for(int i = buckets.length - 1; i >= 0; i--){
if(k <= 0) break;
if(buckets[i] == null) continue;
for(int num : buckets[i]){
if(k <= 0) break;
ans.add(num);
k--;
}
}
return ans;
}

最新文章

  1. Node.js:DNS模块的使用
  2. linux下添加mysql用户并授权
  3. Linux ACL
  4. mimikatz不反弹读取密码
  5. poj 1159 (DP LCS)
  6. ARP防火墙绑定网关MAC地址预防ARP攻击和P2P终结者
  7. iOS开发--通过MultipeerConnectivity完成蓝牙通讯
  8. 【HDOJ】2266 How Many Equations Can You Find
  9. 修改Eclipse的WorkSpace保持数[转载]
  10. iOS系统自带的 UIAlertView 自动旋转的实现
  11. 【干货】免费获得WebStorm软件
  12. Python3 的序列
  13. 解决ajax 跨域请求问题
  14. Selenium 3----设置元素等待
  15. VMware Workstation 14永久激活密钥
  16. asp.net ajax get 调用(和post不一样,直接返回json才行,否则报错;post不能返回json)
  17. pyautogui_pdf内容提取到excel内_3
  18. RxJava + Retrofit
  19. 11204RAC-dbca建库脚本
  20. 用adb取出在手机中安装的apk

热门文章

  1. js中Date的构造函数解读
  2. go中基本数据类型的默认值
  3. 【LeetCode】图论 graph(共20题)
  4. windows平台搭建Mongo数据库复制集(类似集群)(三)
  5. Es学习第八课, Filter、bool和范围查询
  6. react-jsx和数组
  7. postgre存储过程或者视图中&quot;::&quot;双冒号是什么意思
  8. 每天一个linux命令:less(14)
  9. 【加密】RSA验签及加密
  10. flask01