Given a non-empty array of integers, return the k most frequent elements.
Example 1:
Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]
Example 2:
Input: nums = [1], k = 1
Output: [1]
Note:
* You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
* Your algorithm's time complexity must be better than O(n log n), where n is the array's size.

共用部分是用map统计频次。接下来选出topk频次有variation。

1.O(nlogk), O(k). 堆。
写专属comparator,根据Entry<K, V>里的V也就是本题的频率排序,让堆顶始终维持是最小频率的元素,你最菜,当堆大小过k的时候把你挤走哦!

2.O(n), O(n). bucket sort。要用到频率最多也就是n的信息+O(n)的空间。
第一遍扫计算频率
第二遍扫根据频率把元素值放到对应frequency的bucket里。
第三遍扫bucket,从右往左(从高频到低频),凑满k个元素。
细节:
1.bucket因为不能保证某一频率只有一元素,所以要用List<Integer>[], generic type初始化特别,要List<Integer>[] buckets = new List[nums.length + 1];注意等号右边不带generic 

实现1:

class Solution {private class EntryComparator implements Comparator<Map.Entry<Integer, Integer>> {@Override// P2: 要过OJ要声明一下Map.Entry, 没办法只写Entry,因为不够普遍吧,没适配。public int compare(Map.Entry<Integer, Integer> a, Map.Entry<Integer, Integer> b) {return a.getValue() - b.getValue();}}public List<Integer> topKFrequent(int[] nums, int k) {Map<Integer, Integer> freqs = new HashMap<>();for (int num : nums) {freqs.put(num, freqs.getOrDefault(num, 0) + 1);}// 1.PQPriorityQueue<Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>(new EntryComparator());for (Map.Entry<Integer, Integer> e : freqs.entrySet()) {minHeap.offer(e);if (minHeap.size() > k) {minHeap.poll();}}List<Integer> ans = new ArrayList<>();for (int i = 0; i < k; i++) {// P1:注意加到答案的是key不是entry
            ans.add(minHeap.poll().getKey());}Collections.reverse(ans);return ans;}
}

实现2:

class Solution {public List<Integer> topKFrequent(int[] nums, int k) {Map<Integer, Integer> freqs = new HashMap<>();for (int num : nums) {freqs.put(num, freqs.getOrDefault(num, 0) + 1);}// 1.bucket sort// P1: 注意这个初始化!List<Integer>[] buckets = new List[nums.length + 1];for (int num : freqs.keySet()) {int frequency = freqs.get(num);if (buckets[frequency] == null) {buckets[frequency] = new ArrayList<>();}buckets[frequency].add(num);}List<Integer> ans = new ArrayList<>();for (int i = buckets.length - 1; i >= 0; i--) {if (buckets[i] == null) {continue;}for (int j = 0; j < buckets[i].size() && k > 0; j++) {ans.add(buckets[i].get(j));k--;}}return ans;}
}

转载于:https://www.cnblogs.com/jasminemzy/p/9739815.html

leetcode347 - Top K Frequent Elements - medium相关推荐

  1. 力扣347:前k个高频元素---leetcode347:Top K Frequent Elements

    leetcode347题目链接:https://leetcode.cn/problems/top-k-frequent-elements 目录 一.题目描述 二.思路 1.什么是优先级队列呢? 2.什 ...

  2. 【LeetCode 剑指offer刷题】查找与排序题12:Top K Frequent Elements

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Top K Frequent Elements Given a non-empty array of integer ...

  3. [leetcode]347. Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements. For example, Given [1,1,1, ...

  4. Leetcode: Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements.For example, Given [1,1,1,2 ...

  5. Leetcode - 347. Top K Frequent Elements(堆排序)

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

  6. [swift] LeetCode 347. Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements. For example, Given [1,1,1, ...

  7. leetcode 347. Top K Frequent Elements | 347. 前 K 个高频元素(大根堆)

    题目 https://leetcode.com/problems/top-k-frequent-elements/ 题解 参考:leetcode 215. Kth Largest Element in ...

  8. LeetCode Top K Frequent Elements

    题意:给出一个数组,求出前k个出现频率最多的数 思路:首先统计每个元素的次数(用Map),然后用堆排序只统计前k个(PriorityQueue) 代码如下: class Solution {class ...

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

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

最新文章

  1. R语言:数据筛选match
  2. 剖析Elasticsearch集群系列第三篇 近实时搜索、深层分页问题和搜索相关性权衡之道...
  3. Java压缩html
  4. java集合框架介绍_Java集合框架介绍
  5. 一步一步学动画[1]:Silverlight中Animation的应用
  6. Today is my birthday
  7. css checkbox自动换行,CSS checkbox
  8. 用turtle库画五角星
  9. LINQ to SQL语句 收藏系列
  10. 测试音频质量的软件,音频质量PESQ得分评估原理与步骤
  11. ERwin 正向工程
  12. 页面置换算法(FIFO、LRU、LFU)c++实现
  13. Listary与QTtabbar整合
  14. 通信工程毕业干计算机网络,通信工程专业毕业后能做什么?
  15. numpy 判断是否实数
  16. Android 4.4 kitkat以上及以下根据uri获取路径的方法
  17. 战火与秩序迁城显示服务器忙,战火与秩序迁城方法介绍
  18. solr整合paoding分词注意的一些细节
  19. Windows7 Ubuntu 双系统安装卸载工具备份
  20. shell脚本编程学习笔记3(xdl)——Bash变量的运算与测试

热门文章

  1. iOS---GCD的三种常见用法
  2. containerd容器命令
  3. Oracle常用知识
  4. ubuntu下配置bind9为局域网的DNS服务器
  5. VirtualBox Nonexistent host networking interface 错误解决方案
  6. 10分钟搞定 Java 并发队列好吗?好的
  7. 从架构到代码:软件开发最新趋势解析
  8. Spring Boot 五种热部署方式,再也不用老重启了!
  9. 7年Java后端被淘汰,一路北漂辛酸史。。。
  10. 什么是Scanner?next()和hasNext() ? nextLine()和hasNextLine()?