题目

347. 前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:输入: nums = [1], k = 1
输出: [1]提示:1 <= nums.length <= 105
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。

方法1:HashMap+桶排

public int[] topKFrequent(int[] nums, int k) {//k:nums的每一个数,v:nums中每一个数出现的次数Map<Integer, Integer> freqMap = new HashMap<>();for (int x : nums) {freqMap.put(x, freqMap.getOrDefault(x, 0) + 1);}//bucket[freq]出现的次数,哪些数出现了freq次List<Integer>[] bucket = new List[nums.length + 1];for (int x : freqMap.keySet()) {int freq = freqMap.get(x);if (bucket[freq] == null) bucket[freq] = new ArrayList<>();bucket[freq].add(x);}List<Integer> res = new ArrayList<>();//从高到低freq开始收集resfor (int i = bucket.length - 1; i >= 0; --i) {if (bucket[i] != null) {for (int j = 0; j < bucket[i].size() && res.size() < k; j++) {res.add(bucket[i].get(j));}}}int[] ans = new int[res.size()];for (int i = 0; i < res.size(); i++) ans[i] = res.get(i);return ans;
}

方法2:HashMap+大根堆

 public int[] topKFrequent(int[] nums, int k) {//k:nums的每一个数,v:nums中每一个数出现的次数Map<Integer, Integer> freqMap = new HashMap<>();for (int x : nums) {freqMap.put(x, freqMap.getOrDefault(x, 0) + 1);}//做一个大根堆PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>((o1, o2) -> o2.getValue() - o1.getValue());for (Map.Entry<Integer, Integer> e : freqMap.entrySet()) {pq.offer(e);}List<Integer> res = new ArrayList<>();while (res.size() < k) {res.add(pq.poll().getKey());}int[] ans = new int[res.size()];for (int i = 0; i < res.size(); i++) ans[i] = res.get(i);return ans;}

方法3:HashMap+TreeMap

        public int[] topKFrequent(int[] nums, int k) {//k:nums的每一个数,v:nums中每一个数出现的次数Map<Integer, Integer> freqMap = new HashMap<>();for (int x : nums) {freqMap.put(x, freqMap.getOrDefault(x, 0) + 1);}TreeMap<Integer, List<Integer>> treeMap = new TreeMap<>();for (int x : freqMap.keySet()) {int freq = freqMap.get(x);treeMap.putIfAbsent(freq, new ArrayList<>());treeMap.get(freq).add(x);}List<Integer> res = new ArrayList<>();while (res.size() < k) {Map.Entry<Integer, List<Integer>> e = treeMap.pollLastEntry();res.addAll(e.getValue());}int[] ans = new int[res.size()];for (int i = 0; i < res.size(); i++) ans[i] = res.get(i);return ans;}

方法4:快速排序

public int[] topKFrequent(int[] nums, int k) {//k: 元素num v:出现的频次Map<Integer, Integer> map = new HashMap<>();for (int x : nums) map.put(x, map.getOrDefault(x, 0) + 1);List<int[]> freqList = new ArrayList<>();for (Map.Entry<Integer, Integer> e : map.entrySet()) {int num = e.getKey(), freq = e.getValue();freqList.add(new int[]{num, freq});}int[] res = new int[k];quickSort(freqList, 0, freqList.size() - 1, res, 0, k);return res;}/*** @param freqList 频次的list [0]为num [1]为freq* @param start    list的开始位置* @param end      list的结束位置* @param res      结果数组* @param resIndex 结果数组的当前待添加的下标索引* @param k        k*/
private void quickSort(List<int[]> freqList, int start, int end,int[] res, int resIndex, int k) {int pivotIndex = (int) (Math.random() * (end - start + 1)) + start;//随机选择哨兵Collections.swap(freqList, start, pivotIndex);//交换哨兵与start的位置int pivotFreq = freqList.get(start)[1];//当前的频次int index = start;for (int i = start + 1; i <= end; i++) {if (freqList.get(i)[1] >= pivotFreq) {//将频次高的放在左侧,频次低的放在右侧Collections.swap(freqList, index + 1, i);index++;}}Collections.swap(freqList, start, index);//将哨兵的位置放置在正确的位置if (index - start >= k) {//[start...index]段的元素比k多,需要在[start...index]段继续缩小范围quickSort(freqList, start, index - 1, res, resIndex, k);} else {for (int i = start; i <= index; i++) {//左侧部分即[start...index]都是需要的,开始收集res[resIndex++] = freqList.get(i)[0];}if (index - start + 1 < k) { // 当pivot和起点间的个数小于k时,则从pivot到end再继续找剩下的前(k - (pivot - start + 1))大的元素quickSort(freqList, index + 1, end, res, resIndex, k - (index - start + 1));}}}

[LeetCode]347. 前 K 个高频元素相关推荐

  1. LeetCode——347. 前 K 个高频元素【最小堆实现】

    LeetCode--347. 前 K 个高频元素[最小堆实现] 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例1: 输入: n ...

  2. Leetcode 347. 前 K 个高频元素

    Leetcode 347. 前 K 个高频元素 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/top-k-freque ...

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

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

  4. LeetCode 347. 前 K 个高频元素(C++)*

    该题在不考虑时间复杂度的要求下,可以使用哈希表来存储元素的次数,或者使用排序算法:为了提高算法的效率,考虑使用优先队列来实现大根堆. 1.题目如下: 给你一个整数数组 nums 和一个整数 k ,请你 ...

  5. LeetCode 347. 前 K 个高频元素(哈希/优先队列)

    文章目录 1. 题目 2. 解题 2.1 哈希 2.2 优先队列 1. 题目 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], ...

  6. Leetcode 347.前K个高频元素

    Time: 20190910 Type: Medium 题目描述 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 ...

  7. Leetcode 347. 前K个高频元素 解题思路及C++实现

    方法一:最小堆 解题思路: 先使用一个unordered_map来遍历nums容器,得到每个元素对应的频数. 再使用最小堆,对unordered_map中的频数进行遍历,得到k个最大的频数对应的< ...

  8. 【LeetCode】【HOT】347. 前 K 个高频元素(哈希表+优先队列)

    [LeetCode][HOT]347. 前 K 个高频元素 文章目录 [LeetCode][HOT]347. 前 K 个高频元素 package hot;import java.util.Arrays ...

  9. 模拟卷Leetcode【普通】347. 前 K 个高频元素

    347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案. 示例 1: 输入: nums = [1,1,1,2,2 ...

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

    347. 前 K 个高频元素 - 力扣(LeetCode) (leetcode-cn.com) 一:使用对象进行解题,对象的属性为给定数组的元素,属性值为给定数组元素出现的次数: 二:把对象转成数组, ...

最新文章

  1. 华为云大数据存储的冗余方式是三副本_大数据入门:HDFS数据副本存放策略
  2. 深度学习|实例分割:3D-BoNet
  3. 揭秘5G+AI时代的机器人世界!七大核心技术改变人类生活
  4. C++线程同步之临界区
  5. php页面时长,页面执行时间太长,请诸位大大帮忙看看
  6. [TJOI2014] Alice and Bob
  7. Vue+Axios同步请求
  8. 生成器 python0 1 8 27 64_python 生成式和生成器
  9. python怎么创建函数_Python创建与调用函数
  10. SOA相关资料整理分享
  11. 什么是互联网思维?给你最全面的解释
  12. 【[TJOI2014]上升子序列】
  13. Jackson的JSON——JsonUtils工具类
  14. 简单易用的运动控制卡(八):直线插补和手轮运动
  15. 爱快可以外接文件服务器吗,听说爱快路由器也支持NAS了?
  16. 送5本《Kafka权威指南》第二版
  17. SOLO:Segmenting Objects by Locations
  18. GNSS精密单点定位学习:天线相位中心改正文件.atx文件格式说明
  19. 10年跳槽7次,过来人告诉你有效跳槽和无效跳槽的区别
  20. 记一次真实的网站被黑经历

热门文章

  1. ffdshow 源代码分析 8: 视频解码器类(TvideoCodecDec)
  2. 双线威廉指标_电影中的技术失败是新的威廉尖叫
  3. 07过去进行时,过去将来时,陈述句 变宾语从句(that 引导)
  4. python哥德巴赫猜想
  5. python个人所得税怎么写_Python计算个人所得税!
  6. wcdma码片速率_码片速率 解释
  7. 计算机网络教室学生守则,高中计算机网络教室公益性开放管理制度
  8. syntax sugar 2
  9. C#语法糖(Csharp Syntactic sugar)
  10. Codevs 4909 寂寞的堆