力扣 - 347. 前 K 个高频元素
题目
思路1(哈希表与排序)
- 先用哈希表记录所有的值出现的次数
- 然后将按照出现的次数进行从高到低排序
- 最后取前 k 个就是答案了
代码
class Solution {
public int[] topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> hashtable = new HashMap<>();
// 统计每个次数出现的次数
for (int num : nums) {
hashtable.put(num, hashtable.getOrDefault(num, 0) + 1);
}
// 排序
List<Map.Entry<Integer, Integer>> list = new ArrayList<>(hashtable.entrySet());
list.sort(new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
// 获取前k高的结果
int[] res = new int[k];
for (int i = 0; i < k; i++) {
res[i] = list.get(i).getKey();
}
return res;
}
}
复杂度分析
- 时间复杂度:\(O(NlogN)\),其中 N 为数组长度,遍历一遍花的时间是N,但是由于排序的时间复杂度是NlogN,所以总的时间复杂度为NlogN
- 空间复杂度:\(O(N)\),其中 N 为数组长度
思路2(建堆)
- 也是先用哈希表统计出现的次数
- 然后利用小顶堆获取前k高的元素,堆操作的时间复杂度为logk,所以总的就是Nlogk
代码
class Solution {
public int[] topKFrequent(int[] nums, int k) {
// 用哈希表存储出现次数
Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
for (int num : nums) {
hashtable.put(num, hashtable.getOrDefault(num, 0) + 1);
}
// 使用优先队列
PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1];
}
});
// 小顶堆,容量只为k,存储前n大的元素
for (Map.Entry<Integer, Integer> entry : hashtable.entrySet()) {
int element = entry.getKey();
int count = entry.getValue();
if (queue.size() == k) {
// 保证队列存储的前k个元素出现频率都是最多的
if (queue.peek()[1] < count) {
queue.poll();
queue.offer(new int[]{element, count});
}
} else {
queue.offer(new int[]{element, count});
}
}
// 将优先队列元素出队转换为结果
int[] res = new int[k];
for (int i = 0; i < k; i++) {
res[i] = queue.poll()[0];
}
return res;
}
}
复杂度分析
- 时间复杂度:\(O(Nlogk)\),其中 N 为数组长度,由于堆的大小至多为 k,因此每次堆操作需要 O(logk) 的时间,共需 O(Nlogk) 的时间
- 空间复杂度:\(O(N)\),其中 N 为数组长度
力扣 - 347. 前 K 个高频元素的更多相关文章
- 力扣347——前 K 个高频元素
这道题主要涉及的是对数据结构里哈希表.小顶堆的理解,优化时可以参考一些排序方法. 原题 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2, ...
- 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素
第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...
- Java实现 LeetCode 347 前 K 个高频元素
347. 前 K 个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输 ...
- [LeetCode]347. 前 K 个高频元素(堆)
题目 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1 ...
- leetcode 347. 前 K 个高频元素
问题描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums ...
- Leetcode 347.前K个高频元素 By Python
给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], ...
- 347. 前K个高频元素
题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = ...
- leetcode.排序.347前k个高频元素-Java
1. 具体题目 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums ...
- [LeetCode] 347. 前K个高频元素
python 版方法1:链表 class Solution(object): def topKFrequent(self, nums, k): """ :type num ...
随机推荐
- Adobe DreamWeaver CC 快捷键
1 1 ADOBE DREAMWEAVER CC Shortcuts: DREAMWEAVER CC DOCUMENT EDITING SHORTCUTS Select Dreamweaver > ...
- Scratch & Flappy Turtle & Flappy Bird & Game
Scratch & Flappy Turtle & Flappy Bird & Game Flappy Turtle Game https://scratch.mit.edu/ ...
- linux bash which
linux bash which https://linuxize.com/post/linux-which-command/ Linux which command is used to ident ...
- taro & Error: spawn taro ENOENT
taro & Error: spawn taro ENOENT https://stackoverflow.com/questions/27688804/how-do-i-debug-erro ...
- py django 渲染前端打包的视图
前端打包后基本这样 $ ls dist /static index.html 在index.html中的publicPath指向static 1. 创建一个www模块 $ python manage. ...
- Linux 内核和 Windows 内核有什么区别?
Windows 和 Linux 可以说是我们比较常见的两款操作系统的. Windows 基本占领了电脑时代的市场,商业上取得了很大成就,但是它并不开源,所以要想接触源码得加入 Windows 的开发团 ...
- 面试20家互联网公司总结出的高频MySQL面试题
1.MyISAM存储获与InnoDB存储引擎 MyISAM存储引擎不支持事务.表锁设计.支持全文索引.缓冲池只缓存索引文件,并不缓存数据文件. InnoDB存储引擎支持事务.行锁设计.支持外键,支持 ...
- 【python3.x】发送自动化测试报告邮件
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.python的smtplib提供了 ...
- JS产生GUID
//生成全球唯一字符串function guidGenerator() { var S4 = function () { return (((1 + Math.random()) * 0x10000) ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字 + 摩尔投票法
剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majo ...