题目要求:

分析:
这种题目又来了,根深蒂固的HashMap思想绝对是呼之欲出。于是不假思索,先用HashMap求出每个数字有几个再说。
求出每个数字的频率之后,我们想要求出第k高的频率的元素,并且时间复杂度必须优于O(nlog n),那么该如何求呢?
我们应该想到,堆的时间复杂度正好是O(nlog n),可以用堆来求。而堆是可以利用优先队列PriorityQueue来求的。
我们想要求出第k个频率的数字,那么肯定要堆这些数字出现的次数进行排列,那么优先队列正好是最合适的求法,我们可以让它最先pop出来的是最大值,至于这个排序方法,就是利用匿名内部类,把compare方法给重写一下,这个方法已经用过多次了。
然后就可以取出map中的key值与优先队列中的peek值进行比较了,如果队列没满(队列的容量为k),则将他们加入进来,如果队列满了,并且现在遍历到的这个值大于队列中的peek值,就把队列中最小的给remove掉,然后把这个值给add进去。
最后只要把优先队列中的值给弹出,然后再add到list中去就可以了。

具体代码如下:

class Solution {public List<Integer> topKFrequent(int[] nums, int k) {if(nums == null || nums.length == 0)return new ArrayList<>();Map<Integer, Integer> map = new HashMap<>();for(int num : nums) {if(!map.containsKey(num)) {map.put(num, 1);} else {map.put(num, map.get(num) + 1);}}// 遍历map,用最小堆保存频率最大的k个元素PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {return map.get(a) - map.get(b);}});//将Map中所有的键存入到set集合中for (Integer key : map.keySet()) {if (pq.size() < k) {pq.add(key);} else if (map.get(key) > map.get(pq.peek())) {pq.remove();pq.add(key);}}// 取出最小堆中的元素List<Integer> list = new ArrayList<>();while (!pq.isEmpty()) {list.add(pq.remove());}return list;}
}

leetcode347——前K个高频元素——java实现相关推荐

  1. (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)

    目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...

  2. leetcode347. 前 K 个高频元素(排序)

    给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], ...

  3. Leetcode--347. 前k个高频元素

    给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], ...

  4. leetcode347. 前 K 个高频元素

    一:题目 二:上码 class Solution {public:vector<int> topKFrequent(vector<int>& nums, int k) ...

  5. Leetcode题347、前K个高频元素(Python题解)Amazon面试题

    问题: 题目来源:力扣(LeetCode) leetcode347.前K个高频元素 难度:中等 分析: 本题解提供四种方法,分别是python的Counter技巧.堆.桶排序.快排. 对于python ...

  6. 力扣347:前k个高频元素---leetcode347:Top K Frequent Elements

    leetcode347题目链接:https://leetcode.cn/problems/top-k-frequent-elements 目录 一.题目描述 二.思路 1.什么是优先级队列呢? 2.什 ...

  7. Java实现 LeetCode 347 前 K 个高频元素

    347. 前 K 个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输 ...

  8. 【LeetCode】【HOT】347. 前 K 个高频元素(哈希表+优先队列)

    [LeetCode][HOT]347. 前 K 个高频元素 文章目录 [LeetCode][HOT]347. 前 K 个高频元素 package hot;import java.util.Arrays ...

  9. 2021-11-12:前 K 个高频元素。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。提示:1 <= nums.length <=

    2021-11-12:前 K 个高频元素.给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案.提示:1 <= nums.length ...

  10. 前K个高频元素[小根堆和大根堆的使用]

    小根堆 前言 一.前K个高频元素 二.小根堆&大根堆 1.O(KlogN)大根堆 2.O(NlogK)小根堆 总结 参考文献 前言 当题目需要有序性时,果断排序,可二分快速寻找答案,或是利用有 ...

最新文章

  1. unity_简单五子棋的实现(无AI)
  2. python字符串的方法和列表的方法_python 字符串方法及列表,元组,字典(一)
  3. 使用RAID增加传统机器硬盘的性能
  4. ASP.Net Core 2.0中的Razor Page不是WebForm
  5. 使用JavaConfig的SpringMVC4 + Spring Data JPA + SpringSecurity配置
  6. mysql 查看所有表的引擎_MySQL查看数据库、表的占用空间大小以及某个库中所有表的引擎类型...
  7. ajax遍历递归树数据,怎么用JS递归发送AJAX请求
  8. linux系统rootkit恶意软件安全检测工具rkhunter安装部署、使用详解
  9. error: 'Can't connect to local MySQL server through socket '/data/3307/data/mysql.sock' (2)'
  10. 去除vss源代码管理
  11. mvc:annotation-driven /注解意义
  12. 偏向锁、轻量级锁、重量级锁、锁升级、锁对比
  13. 中山大学delphi视频下载(51讲)
  14. 牛客网Python笔试技巧、单行多行输入方法以及代码调试技巧
  15. 基于python的论文前言怎么写_毕业论文前言怎么写
  16. 如何选购计算机主板电池,电脑主板电池型号的选择和更换
  17. 《美人天下》颠覆小公主之死 李治掌控全局_0
  18. 秦曾昌人工智能课程---2、机器学习中的数学基础2
  19. 写论文需要哪些软件?用迅读PDF大师,PDF转换编辑压缩
  20. 企业内部邮件服务器的架构

热门文章

  1. 浏览器提示网站链接不安全,证书过期了
  2. 解决雷电模拟器一直出现安全证书有问题
  3. 计算机软件著作权登记去哪查询,软件著作权在哪里查询
  4. java菱形_Java 之 菱形
  5. 测试结果OK、NG、NT、POK的意思
  6. Python爬取Facebook公共主页帖子
  7. mib browser使用
  8. 【ARM】Linaro Security module
  9. spring的依赖注入是什么意思
  10. 作业(数组)---运行环境winTC(二)