LeetCode:前K个高频元素【347】
LeetCode:前K个高频元素【347】
题目描述
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
说明:
- 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
- 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。
题目分析
我们还是基于优先队列或者说是小顶堆来AC这个题目。这道题是数组中的第K个最大元素【215】的进阶版。
我们在215题中说了,优先队列的排序规则是基于比较器或者自然顺序的,这道题就是基于比较器的。至于为什么可以用堆来实现,请查看215的题解,此处不在赘述。
首先我们堆的每个节点保存了两个信息(数值,频率),并且存在对应关系,所以我们可以使用Map(Key,Value)来存储节点信息。
Map<Integer,Integer> countMap = new HashMap<>();
for(int num:nums)
countMap.put(num,countMap.getOrDefault(num,0)+1);
然后,优先队列的比较器应该是基于频率的,也就是Map中的Value:
new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return countMap.get(o1).compareTo(countMap.get(o2));
}
}
基于这样的比较器,我们就可以建立一个根据频度从小打大的小顶堆。翻看了别人的代码后,我发现可以用Lambda表达式来简写比较规则
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(k,Comparator.comparingInt(num -> countMap.get(num)));
这样一句话就指明了,比较器的比较规则,Lambda表达式果然很神奇。但是使用了Lambda表达式后效率明显下降了,我也不太懂Lambda表达式,让我们继续努力吧:


Java题解
import java.util.*;
public class TopKFrequentElements_347 {
public List<Integer> topKFrequent(int[] nums, int k) {
Map<Integer,Integer> countMap = new HashMap<>();
for(int num:nums)
countMap.put(num,countMap.getOrDefault(num,0)+1);
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(k,Comparator.comparingInt(num -> countMap.get(num)));
for (int num : countMap.keySet()) {
priorityQueue.offer(num);
if (priorityQueue.size() > k) {
priorityQueue.poll();
}
}
return new ArrayList<>(priorityQueue);
}
public List<Integer> topKFrequent1(int[] nums, int k) {
Map<Integer,Integer> countMap = new HashMap<>();
for(int num:nums)
countMap.put(num,countMap.getOrDefault(num,0)+1);
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(k, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return countMap.get(o1).compareTo(countMap.get(o2));
}
});
for (int num : countMap.keySet()) {
priorityQueue.offer(num);
if (priorityQueue.size() > k) {
priorityQueue.poll();
}
}
return new ArrayList<>(priorityQueue);
}
}
LeetCode:前K个高频元素【347】的更多相关文章
- Java实现 LeetCode 347 前 K 个高频元素
347. 前 K 个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输 ...
- 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)
目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...
- 力扣 - 347. 前 K 个高频元素
目录 题目 思路1(哈希表与排序) 代码 复杂度分析 思路2(建堆) 代码 复杂度分析 题目 347. 前 K 个高频元素 思路1(哈希表与排序) 先用哈希表记录所有的值出现的次数 然后将按照出现的次 ...
- 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素
第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...
- Top K Frequent Elements 前K个高频元素
Top K Frequent Elements 347. Top K Frequent Elements [LeetCode] Top K Frequent Elements 前K个高频元素
- 前 K 个高频元素问题
前 K 个高频元素问题 作者:Grey 原文地址: 前 K 个高频元素问题 题目描述 LeetCode 347. Top K Frequent Elements 思路 第一步,针对数组元素封装一个数据 ...
- 代码题(3)— 最小的k个数、数组中的第K个最大元素、前K个高频元素
1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public ...
- leetcode347. 前 K 个高频元素
题目最终需要返回的是前 kk 个频率最大的元素,可以想到借助堆这种数据结构,对于 kk 频率之后的元素不用再去处理,进一步优化时间复杂度. 具体操作为: 借助 哈希表 来建立数字和其出现次数的映射,遍 ...
- [LeetCode] 347. Top K Frequent Elements 前K个高频元素
Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...
随机推荐
- HttpClient+jsoup登录+解析 163邮箱
找了几个,只有这个靠谱,用的是httpclient4,另外还需要commons-lang和jsoup包 http://jsoup.org/ http://www.oschina.net/code/sn ...
- 使用Selectivizr让你的 CSS3选择器 通吃IE6/7/8
说到HTML5,总是会让人不自觉的想到CSS3,貌似他们就应该是成双成对.OK!前几天和大家分享了<使用html5shiv让HTML5通吃IE6/7/8>,那今天,便再和大家分享一个能让H ...
- 圆角带箭头的提示框css实现
css是一个很强大的东西,很多网页效果,我们可以通过css直接实现.今天给大家分享的是一个用css实现的圆角带箭头的提示框. 效果如下图: 这一个样式主要涉及到了css的边框样式border的运用和定 ...
- php 知乎爬虫
http://blog.jobbole.com/88788/ https://github.com/owner888/phpspider 费了半天劲安装了redis,导出cookie,发现仍是缺失很多 ...
- 什么是 AJAX ?
什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味 ...
- jqgrid的排序问题
今天是本人解决的一个小bug 所以写的粗略些. 问题是这样的ORDER BY a.$sidx $sord 当时本人排序时候没用jqgrid的默认排序(可能今天这个大家看不懂,很抱歉啊各位,今天主要 ...
- windows 下安装securecrt 绿色版
- CSS-微信开放UI样式
下面的链接是微信开放的CSS的样式: http://weui.github.io/weui/ 附上GitHub地址:https://github.com/weui/weui
- iOS-如何导出P12文件
1.第一次用博客园,排版有点问题. 2.第一步点击进入Launchped 3.第二步点击钥匙串访问 4.第三步 找到登录下的Distribution 然后右键选择导出 5.第四步 选择下面的个人信息交 ...
- Dropdownlist中用viewmodel传值处理方法
背景:MVC框架,页面使用razor语法,下拉框的话使用了@Html.DropDownList(),以前传值使用viewdata,但是我们老大说这个方式比较low,希望我可以使用viewmodel的方 ...