小根堆

  • 前言
  • 一、前K个高频元素
  • 二、小根堆&大根堆
    • 1、O(KlogN)大根堆
    • 2、O(NlogK)小根堆
  • 总结
  • 参考文献

前言

当题目需要有序性时,果断排序,可二分快速寻找答案,或是利用有序性快速判定,如双指针等等。除此之外,小根堆和大根堆是取K个的利器,原型基于树状数组–堆结构。

一、前K个高频元素

二、小根堆&大根堆

1、O(KlogN)大根堆

// 前K个高频元素
// 当需要有序性的时候,果断排序。
public class TopKFrequent {// O(KlogN),让大顶堆不断出K个元素。public int[] topKFrequent(int[] nums, int k) {// 先预处理数据。Map<Integer, Integer> m = new HashMap<>();for (int num : nums) m.put(num, m.getOrDefault(num, 0) + 1);// 把所有数据装入大顶堆。Set<Map.Entry<Integer, Integer>> entries = m.entrySet();PriorityQueue<int[]> que = new PriorityQueue<>((o1, o2) -> o2[1] - o1[1]);for (Map.Entry<Integer, Integer> entry : entries) {que.offer(new int[]{entry.getKey(), entry.getValue()});}int[] r = new int[k];for (int i = 0; i < k; i++) {r[i] = que.poll()[0];}return r;}
}

2、O(NlogK)小根堆

// O(NlogK),让小顶堆的元素不超过K个。
class TopKFrequent2 {public int[] topKFrequent(int[] nums, int k) {// 先预处理数据。Map<Integer, Integer> m = new HashMap<>();for (int num : nums) m.put(num, m.getOrDefault(num, 0) + 1);// 把数据装入小顶堆。Set<Map.Entry<Integer, Integer>> entries = m.entrySet();PriorityQueue<int[]> que = new PriorityQueue<>(Comparator.comparingInt(o -> o[1]));for (Map.Entry<Integer, Integer> entry : entries) {// 让堆中的元素不超过K个。if (que.size() == k && que.peek()[1] < entry.getValue()) que.poll();if (que.size() != k) que.offer(new int[]{entry.getKey(), entry.getValue()});}//遍历小顶堆所有元素int[] r = new int[k];for (int i = 0; i < k; i++) r[i] = que.poll()[0];return r;}
}

总结

1)当需要有序性的时候,果断排序。

2)小根堆和大根堆的基本使用场景和方式,Java中又现成的API,即优先队列PriorityQueue类。

参考文献

[1] LeetCode 前K个高频元素

前K个高频元素[小根堆和大根堆的使用]相关推荐

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

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

  2. 前K个高频元素(top k)(TX)

    思路 这道题目主要涉及到如下三块内容: 1.要统计元素出现频率 2.对频率排序 3.找出前K个高频元素 首先统计元素出现的频率,这一类的问题可以使用map来进行统计. 然后是对频率进行排序,这里我们可 ...

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

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

  4. 堆排序:大顶堆和小顶堆 + 前K个高频元素

    堆 一.堆排序 小顶堆 举个栗子 大顶堆 二.前K个高频元素 思路分析 三.构造器代码解析 一.堆排序 要了解大顶堆和小顶堆,我们先简单了解一下堆排序. 堆排序(Heapsort)是指利用堆这种数据结 ...

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

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

  6. 统计list里面相同元素个数_LeetCode 第 347 号问题:前 K 个高频元素

    本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一. 个人网站:https://www.cxyxiaowu.com 今天分享的题目来源于 LeetCode 上第 347 号问题: ...

  7. 215.数组中的第K个最大元素/347. 前 K 个高频元素

    2020-05-25 1.题目描述 数组中的第K个最大元素 2.题解 1.使用冒泡排序 2.使用快速排序 3.优先队列(内部是用堆来实现的) 3.代码 class Solution { public: ...

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

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

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

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

最新文章

  1. ftok file php,Linux和PHP中的ftok函数返回值不一致问题跟踪
  2. String转BigDecimal,BigDecimal常用操作,以及避免踩坑
  3. MySQL学习(四)
  4. P1582 倒水(二进制)
  5. 创业者说:我从创业者大会看到了什么
  6. 操作系统--第一章 绪论(408计算机考研)
  7. opensip db mysql_opensip和opensip_cp安装配置
  8. 大学本科 java教材,大学本科自学java之路——IO
  9. java时间提醒微服务器_springcloud中微服务的优雅停机(已验证)
  10. 深度学习——简化的神经网络模型和概念补充
  11. QT每日一练day2:day1优化以及QT内存管理机制
  12. 怎么设置竖线分栏_做出专业级的Word文档分栏,只需这3个技巧
  13. IEC 60335-2-21:2022 安全-第2-21部分:储水式热水器的特殊要求
  14. 洛谷 U80455 逃跑的Seaway
  15. 520情人节礼物可以送什么?最实用的礼物推荐
  16. 基于华视身份证读卡器读取身份证信息的Android demo
  17. Android显示系统键盘的方法,Android 显示和隐藏软键盘
  18. linux自动关机取消命令,linux关机命令【使用思路】
  19. java版阿里云,百度ai,讯飞语音识别效果简单对比及demo
  20. 用互联网对接传统行业,改良还是颠覆?

热门文章

  1. 一个 SAP 开发工程师在 SAP 德国总部出差的见闻系列 1:出差 ≠ 公费旅游
  2. 图形界面介绍Create Size Blockage
  3. Java数据库篇之mysql VS postgresql
  4. 数学建模之拉依达准则
  5. html代码向左居右对齐
  6. matlab 实验七,matlab 实验七 数字填图问题
  7. 学习记录--香水数据挖掘与分析
  8. 搞定各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 -
  9. web前端学习526-534(变量概述,变量的使用,变量语法扩展,变量命名规范,推荐Diagram Designer)
  10. 很方便的密码加密算法BCrypt