前K个高频元素[小根堆和大根堆的使用]
小根堆
- 前言
- 一、前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个高频元素[小根堆和大根堆的使用]相关推荐
- (补)算法训练Day13 | LeetCode150. 逆波兰表达式求值(栈应用);LeetCode239. 滑动窗口最大值(单调队列);LeetCode347. 前K个高频元素(小顶堆,优先级队列)
目录 LeetCode150. 逆波兰表达式求值 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考 LeetCode239. 滑动窗口最大值 1. 思路 2. 代码实现 3. 复杂度分析 4. ...
- 前K个高频元素(top k)(TX)
思路 这道题目主要涉及到如下三块内容: 1.要统计元素出现频率 2.对频率排序 3.找出前K个高频元素 首先统计元素出现的频率,这一类的问题可以使用map来进行统计. 然后是对频率进行排序,这里我们可 ...
- LeetCode——347. 前 K 个高频元素【最小堆实现】
LeetCode--347. 前 K 个高频元素[最小堆实现] 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例1: 输入: n ...
- 堆排序:大顶堆和小顶堆 + 前K个高频元素
堆 一.堆排序 小顶堆 举个栗子 大顶堆 二.前K个高频元素 思路分析 三.构造器代码解析 一.堆排序 要了解大顶堆和小顶堆,我们先简单了解一下堆排序. 堆排序(Heapsort)是指利用堆这种数据结 ...
- 2021-11-12:前 K 个高频元素。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。提示:1 <= nums.length <=
2021-11-12:前 K 个高频元素.给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案.提示:1 <= nums.length ...
- 统计list里面相同元素个数_LeetCode 第 347 号问题:前 K 个高频元素
本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一. 个人网站:https://www.cxyxiaowu.com 今天分享的题目来源于 LeetCode 上第 347 号问题: ...
- 215.数组中的第K个最大元素/347. 前 K 个高频元素
2020-05-25 1.题目描述 数组中的第K个最大元素 2.题解 1.使用冒泡排序 2.使用快速排序 3.优先队列(内部是用堆来实现的) 3.代码 class Solution { public: ...
- Leetcode题347、前K个高频元素(Python题解)Amazon面试题
问题: 题目来源:力扣(LeetCode) leetcode347.前K个高频元素 难度:中等 分析: 本题解提供四种方法,分别是python的Counter技巧.堆.桶排序.快排. 对于python ...
- 力扣347:前k个高频元素---leetcode347:Top K Frequent Elements
leetcode347题目链接:https://leetcode.cn/problems/top-k-frequent-elements 目录 一.题目描述 二.思路 1.什么是优先级队列呢? 2.什 ...
最新文章
- ftok file php,Linux和PHP中的ftok函数返回值不一致问题跟踪
- String转BigDecimal,BigDecimal常用操作,以及避免踩坑
- MySQL学习(四)
- P1582 倒水(二进制)
- 创业者说:我从创业者大会看到了什么
- 操作系统--第一章 绪论(408计算机考研)
- opensip db mysql_opensip和opensip_cp安装配置
- 大学本科 java教材,大学本科自学java之路——IO
- java时间提醒微服务器_springcloud中微服务的优雅停机(已验证)
- 深度学习——简化的神经网络模型和概念补充
- QT每日一练day2:day1优化以及QT内存管理机制
- 怎么设置竖线分栏_做出专业级的Word文档分栏,只需这3个技巧
- IEC 60335-2-21:2022 安全-第2-21部分:储水式热水器的特殊要求
- 洛谷 U80455 逃跑的Seaway
- 520情人节礼物可以送什么?最实用的礼物推荐
- 基于华视身份证读卡器读取身份证信息的Android demo
- Android显示系统键盘的方法,Android 显示和隐藏软键盘
- linux自动关机取消命令,linux关机命令【使用思路】
- java版阿里云,百度ai,讯飞语音识别效果简单对比及demo
- 用互联网对接传统行业,改良还是颠覆?
热门文章
- 一个 SAP 开发工程师在 SAP 德国总部出差的见闻系列 1:出差 ≠ 公费旅游
- 图形界面介绍Create Size Blockage
- Java数据库篇之mysql VS postgresql
- 数学建模之拉依达准则
- html代码向左居右对齐
- matlab 实验七,matlab 实验七 数字填图问题
- 学习记录--香水数据挖掘与分析
- 搞定各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 -
- web前端学习526-534(变量概述,变量的使用,变量语法扩展,变量命名规范,推荐Diagram Designer)
- 很方便的密码加密算法BCrypt