LeetCode:前K个高频元素【347】

题目描述

给定一个非空的整数数组,返回其中出现频率前 高的元素。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

示例 2:

输入: nums = [1], k = 1
输出: [1]

说明:

  • 你可以假设给定的 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。
  • 你的算法的时间复杂度必须优于 O(n log 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】的更多相关文章

  1. Java实现 LeetCode 347 前 K 个高频元素

    347. 前 K 个高频元素 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输 ...

  2. 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)

    目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...

  3. 力扣 - 347. 前 K 个高频元素

    目录 题目 思路1(哈希表与排序) 代码 复杂度分析 思路2(建堆) 代码 复杂度分析 题目 347. 前 K 个高频元素 思路1(哈希表与排序) 先用哈希表记录所有的值出现的次数 然后将按照出现的次 ...

  4. 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

    第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...

  5. Top K Frequent Elements 前K个高频元素

    Top K Frequent Elements 347. Top K Frequent Elements [LeetCode] Top K Frequent Elements 前K个高频元素

  6. 前 K 个高频元素问题

    前 K 个高频元素问题 作者:Grey 原文地址: 前 K 个高频元素问题 题目描述 LeetCode 347. Top K Frequent Elements 思路 第一步,针对数组元素封装一个数据 ...

  7. 代码题(3)— 最小的k个数、数组中的第K个最大元素、前K个高频元素

    1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public ...

  8. leetcode347. 前 K 个高频元素

    题目最终需要返回的是前 kk 个频率最大的元素,可以想到借助堆这种数据结构,对于 kk 频率之后的元素不用再去处理,进一步优化时间复杂度. 具体操作为: 借助 哈希表 来建立数字和其出现次数的映射,遍 ...

  9. [LeetCode] 347. Top K Frequent Elements 前K个高频元素

    Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...

随机推荐

  1. 在linux下安装配置rabbitMQ详细教程

    在linux下安装配置rabbitMQ详细教程 2017年12月20日 17:34:47 阅读数:7539 安装Erlang 由于RabbitMQ依赖Erlang, 所以需要先安装Erlang. Er ...

  2. Buffer ByteBuffer 缓冲区

    http://blog.sina.com.cn/s/blog_4150f50c0100gfa3.html

  3. 海康网络摄像机调用SDK解码Java版

    两个回调函数: FRealDataCallBack 实现预览回调数据 DecCallBack 解码回调函数 在HCNetSDK.java补充相关函数和结构声明 //播放库函数声明,PlayCtrl.d ...

  4. 【转】MOCK测试

    mock测试:就是在测试过程中,对于某些不容易构造或者 不容易获取的对象,用一个虚拟的对象[mock对象]来创建以便测试的测试方法. mock对象:这个虚拟的对象就是mock对象. mock对象就是真 ...

  5. 第一百四十节,JavaScript,封装库--浏览器检测

    JavaScript,封装库--浏览器检测 在函数库编写一个,浏览器检测对象 /** sys浏览器检测对象,对象下有两个属性,liu_lan_qi属性和xi_tong属性 * liu_lan_qi属性 ...

  6. 【vijos】1765 Caculator(代码题)

    https://vijos.org/p/1765 这题用白书的方法是n^2的,所以我tle了一个点..sad. 我稍微优化了一下. 这个题给我最大的感受不是这个题本身,而是我感受到了自己思考以后并认真 ...

  7. UML学习目录

    用例图:http://www.cnblogs.com/yjjm/archive/2012/01/28/2385861.html http://kb.cnblogs.com/page/129491/

  8. Eclipse设置护眼背景

    Window-->Preferences-->General-->Editors-->Text Editors-->Background color 自定义颜色:色调:8 ...

  9. noip2006 金明的预算

    题目链接:传送门 题目大意:略.. 题目思路:其实单就这道题来说,一个主件最多两个附件,且附件不再包含附件,所以很简单,但是如果主件的附件无限制,附件也可包含无限制的附件,应该怎么做? 首先推荐一篇论 ...

  10. cascade(级联)和inverse关系详解

    序言 写这篇文章之前,自己也查了很多的资料来搞清楚这两者的关系和各自所做的事情,但是百度一搜,大多数博文感觉说的云里雾里,可能博主自己清楚是怎么一回事,但是给一个不懂的人或者一知半解的人看的话,别人也 ...