LeetCode——347. 前 K 个高频元素【最小堆实现】
LeetCode——347. 前 K 个高频元素【最小堆实现】
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例2:
输入: nums = [1], k = 1
输出: [1]
1.思路
①题目中要求我们返回前K个高频的元素,那么我们可以使用最小堆【Java中自带的优先队列】,保证二叉树中每次保留的都是前K个最大的即可。
②对于数值及其出现的次数,我们可以采用Map的实现子类TreeMap。
③Java自带的优先队列所使用的泛型,我们可以封装为一个类,其中,类包含值和次数。
2.代码过程
2.1 将nums数组中的值与次数对应起来【TreeMap】
TreeMap<Integer,Integer> map = new TreeMap<>();for(int num : nums){if(map.containsKey(num)){map.put(num, map.get(num) + 1);}else{map.put(num,1);}}
2.2 定义内部类Freq,将数值与次数封装为一个对象【Freq必须可比,重写compareTo】
class Freq implements Comparable<Freq> {int num; //数字int count;//数字出现的次数public Freq(int num, int count){this.num = num;this.count = count;}@Overridepublic int compareTo(Freq o) {return this.count - o.count;//当前 - 传入}}
2.3 使用Java自带的优先队列PriorityQueue<Freq>遍历map的键,保证队列中为前k个最大值
//Java自带的优先队列是最小堆构建的 值越小越往上走PriorityQueue<Freq> queue = new PriorityQueue<>();for(int num : map.keySet()){if(queue.size() < k){queue.offer(new Freq(num, map.get(num)));}else if(map.get(num) > queue.peek().count){queue.remove();queue.add(new Freq(num, map.get(num)));}}int[] temp = new int[k];for (int i = 0; i < k; i++) {temp[i] = queue.remove().num;}
3.全部代码
import java.util.PriorityQueue;
import java.util.TreeMap;public class Solution347 {public int[] topKFrequent(int[] nums, int k) {TreeMap<Integer,Integer> map = new TreeMap<>();for(int num : nums){if(map.containsKey(num)){map.put(num, map.get(num) + 1);}else{map.put(num,1);}}//Java自带的优先队列是最小堆构建的 值越小越往上走PriorityQueue<Freq> queue = new PriorityQueue<>();for(int num : map.keySet()){if(queue.size() < k){queue.offer(new Freq(num, map.get(num)));}else if(map.get(num) > queue.peek().count){queue.remove();queue.add(new Freq(num, map.get(num)));}}int[] temp = new int[k];for (int i = 0; i < k; i++) {temp[i] = queue.remove().num;}return temp;}class Freq implements Comparable<Freq> {int num; //数字int count;//数字出现的次数public Freq(int num, int count){this.num = num;this.count = count;}@Overridepublic int compareTo(Freq o) {return this.count - o.count;//当前 - 传入}}
}
LeetCode——347. 前 K 个高频元素【最小堆实现】相关推荐
- Leetcode 347. 前 K 个高频元素
Leetcode 347. 前 K 个高频元素 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/top-k-freque ...
- Java实现 LeetCode 347 前 K 个高频元素
347. 前 K 个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输 ...
- LeetCode 347. 前 K 个高频元素(C++)*
该题在不考虑时间复杂度的要求下,可以使用哈希表来存储元素的次数,或者使用排序算法:为了提高算法的效率,考虑使用优先队列来实现大根堆. 1.题目如下: 给你一个整数数组 nums 和一个整数 k ,请你 ...
- Leetcode 347.前K个高频元素
Time: 20190910 Type: Medium 题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 ...
- LeetCode 347. 前 K 个高频元素(哈希/优先队列)
文章目录 1. 题目 2. 解题 2.1 哈希 2.2 优先队列 1. 题目 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], ...
- Leetcode 347. 前K个高频元素 解题思路及C++实现
方法一:最小堆 解题思路: 先使用一个unordered_map来遍历nums容器,得到每个元素对应的频数. 再使用最小堆,对unordered_map中的频数进行遍历,得到k个最大的频数对应的< ...
- 【LeetCode】【HOT】347. 前 K 个高频元素(哈希表+优先队列)
[LeetCode][HOT]347. 前 K 个高频元素 文章目录 [LeetCode][HOT]347. 前 K 个高频元素 package hot;import java.util.Arrays ...
- 模拟卷Leetcode【普通】347. 前 K 个高频元素
347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例 1: 输入: nums = [1,1,1,2,2 ...
- 力扣347 前 K 个高频元素 -- JS
347. 前 K 个高频元素 - 力扣(LeetCode) (leetcode-cn.com) 一:使用对象进行解题,对象的属性为给定数组的元素,属性值为给定数组元素出现的次数: 二:把对象转成数组, ...
最新文章
- 为解决Thymeleaf数字格式化问题而想到的几种方案
- 2014/08/13 – Backbonejs
- 【WebPPTtoPDF】在线将PPT转化为PDF,支持自定义排列方式
- Hamcrest Matchers的高级创建
- 短小精悍-机器学习核心概念、模型、基础知识点简明手册-免费分享
- Nginx进程间通信机制
- 【转】Python中的运算符
- 在DialogFragment中显示大图片
- Python调用Tushare抓取上证指数并作初步分析示例
- SQL:postgresql中使用limit ... offset ... 实现分页查询
- 拓端tecdat|R语言多变量广义正交GARCH(GO-GARCH)模型对股市高维波动率时间序列拟合预测
- 计算机科学与技术实践教学,计算机科学与技术实践教学方法_精编版.doc
- AD18的PCB开槽方法
- 实战教你刷显卡BIOS
- 移动端html富文本编辑器,PC/移动端的富文本编辑器wangEditor的使用
- 用这几款软件轻松自动识别图片文字,快码住
- 大学学python用记笔记吗_Python 应该怎么学?
- 【03】制作第一个zblog模板第三期,完成对接首页所有调用内容,将所有页面拆分公共页面和独立页面
- 时间转换 秒(s)转 ()天 ()小时() 分钟 ()秒
- PHP去掉二维数组中某个元素重复的一维数组
热门文章
- api windows 线程加锁_Windows 进程与线程管理
- 今日头条2018校招编程题
- 电脑端微信双开、N开
- 如何打开sql server配置管理器
- 汇编语言课程设计动态图形设计小车动态图形
- 在天堂与地狱之间——清华浪子梦断中关村[推荐]
- 数学建模-对策论模型
- Python漏洞验证自动化脚本 批量刷SRC
- fib matlab,基于MATLAB的FIB制备三维原子探针样品过程的模拟方法与流程
- 虚拟现实技术利用计算机,虚拟现实 虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生...