文章目录

  • 题目描述
  • 思路 & 代码
    • 更新版:引入 stream 流 + Lambda

题目描述

  • 时间复杂度小于O(n*logn),否则直接sort,再遍历就很轻松。
  • 很有学习价值的题目,第一次使用了优先队列PriorityQueue。

思路 & 代码

  • 首先遍历数组,用HashMap存储 元素值 - 频率 映射
  • 然后维护一个容量为 k 的小顶堆(重写比较器,注意写法),遍历哈希表存入小顶堆中
  • 接着把最终的小顶堆存入数组即可
class Solution {// TreeMap重写comparator?public int[] topKFrequent(int[] nums, int k) {// 先用HashMap存储 元素 - 频率 映射 O(n) O(n)Map<Integer, Integer> hashmap = new HashMap();for(int i = 0; i < nums.length; i++){if(hashmap.containsKey(nums[i])){hashmap.put(nums[i], hashmap.get(nums[i]) + 1);}else{hashmap.put(nums[i], 1);}}// PriorityQueue, 维护一个容量为k的优先队列:小顶堆PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){// 设定以频率分高下@Overridepublic int compare(Integer key1, Integer key2){return hashmap.get(key1) - hashmap.get(key2);}});// 遍历哈希表,轮流对比存入优先队列中 O(n)for(Integer key : hashmap.keySet()){// 未满情况if(pq.size() < k){pq.add(key);}// 满了情况,对比替换else if(hashmap.get(key) > hashmap.get(pq.peek())){// 移头,新增pq.remove();pq.add(key);}}// 获取答案 O(n)int[] ans = new int[k];for(int i = 0; i < k; i++){ans[i] = pq.remove();}return ans;}
}

更新版:引入 stream 流 + Lambda

class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer, Integer> map = new HashMap<>();for(int temp : nums) {if(map.containsKey(temp)) {map.put(temp, map.get(temp) + 1);}else {map.put(temp, 1);}}PriorityQueue<Integer> queue = new PriorityQueue<>((Integer a, Integer b) -> (map.get(a) - map.get(b)));for(Map.Entry<Integer, Integer> entry : map.entrySet()) {if(queue.size() < k) {queue.add(entry.getKey());}else if(entry.getValue() > map.get(queue.peek())) {queue.remove();queue.add(entry.getKey());}}return queue.stream().mapToInt(Integer::valueOf).toArray();}
}

【LeetCode笔记】347. 前K个高频元素(Java、优先队列、小顶堆、HashMap)相关推荐

  1. 力扣347.前 K 个高频元素(优先队列)

    347. 前 K 个高频元素 本题的关键点是对map中的value进行排序. 题目中涉及前几个,考虑优先队列 优先队列要通过lamda表达式写清楚是大数在顶还是小数在顶 逆序: PriorityQue ...

  2. leetcode(力扣) 347. 前 K 个高频元素(优先队列 堆 哈希计数器)

    文章目录 题目描述 思路分析 法一( 哈希计数): 法二(堆): 完整代码 题目描述 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. ...

  3. Leetcode:347. 前 K 个高频元素(C++)

    目录 问题描述: 实现代码与解析: 基于堆排: 原理思路: 优先级队列: 问题描述: 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. ...

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

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

  5. LeetCode——347. 前 K 个高频元素【最小堆实现】

    LeetCode--347. 前 K 个高频元素[最小堆实现] 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例1: 输入: n ...

  6. Leetcode 347. 前 K 个高频元素

    Leetcode 347. 前 K 个高频元素 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/top-k-freque ...

  7. 模拟卷Leetcode【普通】347. 前 K 个高频元素

    347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例 1: 输入: nums = [1,1,1,2,2 ...

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

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

  9. 力扣347 前 K 个高频元素 -- JS

    347. 前 K 个高频元素 - 力扣(LeetCode) (leetcode-cn.com) 一:使用对象进行解题,对象的属性为给定数组的元素,属性值为给定数组元素出现的次数: 二:把对象转成数组, ...

  10. Suzy找到实习了吗Day 13 | 栈和队列结束啦 239. 滑动窗口最大值,347. 前 K 个高频元素

    day 13 239. 滑动窗口最大值 Python的Deque模块详解 solution 我复制的,好难不会写 347. 前 K 个高频元素(一刷我没有用栈,用的哈希法) solution(hash ...

最新文章

  1. 数据结构例程——线性表顺序存储的应用
  2. vlc windows 编译文档
  3. webpack最新版本_webpack小结-开发环境构建优化
  4. LeetCode 2012. 数组美丽值求和
  5. Visual Studio 2019 v16.9 Preview 3 发布
  6. 【python】python的环境搭建
  7. 高级软件工程第一次团队作业
  8. 花生壳5.0 for Linux使用教程
  9. 西门子PLC面向对象编程
  10. 淘宝帝国是如何创建的连载04
  11. Ant Design表格插入图片
  12. 高通设备进入高通9008模式
  13. 皮克定理和任意多边形的面积公式
  14. 互联网产品经理的职责
  15. 糖果游戏(齐大第十一届校赛)
  16. JAVA程序设计题——英雄对战游戏,定义一个描述战斗单位的英雄(Hero)类,此类必须包含以下成员变量:名称(name),生命值(life),技能1攻击力(damage1),防御力(defence)
  17. 网站页面静态化(一)初识
  18. android改变系统语言,Android 9.0设置系统语言
  19. action中获取jsp页面的参数的方法
  20. 深度linux触摸板失灵,解决笔记本安装deepin OS触摸板、WIFI无法使用问题

热门文章

  1. rk3288 android编译环境搭建,RK3288系统编译及环境搭建
  2. a76比a73强多少_arm的a73和a72同上10nm,谁强?
  3. 计算机主机机箱面板辐射,电脑机箱如何防辐射----给大家科普一下
  4. Halcon算子学习:XLD几种边缘连接函数
  5. 建议收藏丨sql行转列的一千种写法!!
  6. 剑指 Offer 35. 复杂链表的复制(哈希/衍生拆分图解)
  7. 常见的设计模式--单例模式
  8. 修改数据库参数oracle,Oracle 修改数据库基本参数
  9. java调用三汇语音卡,三汇语音卡
  10. 用python控制键盘_【python黑科技-pyautogui】教你用python控制滑鼠与键盘