博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
347. Top K Frequent Elements
阅读量:5277 次
发布时间:2019-06-14

本文共 2948 字,大约阅读时间需要 9 分钟。

三刷。

准备面试正好有这个题,把3种方式都撸一下试试。

先是Bucket Sort。因为我们知道所有数据(frequency)的值域:最小是0,element在数组中一次都未出现;最大是数组长度,整个数组只含此element,有了值域就适合Bucket。

前面按出现频率建map,记录每个int出现了多少次,然后按照出现次数入桶int[] bucket,最后倒着遍历,只要桶不是空的就把里面元素加到解里,K个解之后返还。

Time: 建图O(n),入桶O(n),最后检查桶,也是O(n). 最后是O(n)

Space: map O(n), bucket array O(n). 最后O(n)

public class Solution {    public List
topKFrequent(int[] nums, int k) { List
res = new ArrayList<>(); if (k == 0 || nums.length == 0) return res; Map
map = new HashMap<>(); for (int i : nums) { map.put(i, map.getOrDefault(i, 0) + 1); } List
[] bucket = new List[nums.length + 1]; for (int i : map.keySet()) { int val = map.get(i); if (bucket[val] == null) { bucket[val] = new ArrayList
(); } bucket[val].add(i); } for (int i = bucket.length - 1; i >= 0; i--) { if (bucket[i] != null) { res.addAll(bucket[i]); k -= bucket[i].size(); if (k == 0) break; } } return res; }}

方法二:

Max Heap:

首先还是建图,然后按照出现频率放到maxHeap里,然后取出TOP K个就行了,很直接。

Time: 建图O(n) 入pq是 O(n*lgn) TOP K个是 O(klgn) O(n + (n+k)lgn)

Space: 图O(n),PQ takes O(n)

public class Solution {    public List
topKFrequent(int[] nums, int k) { List
res = new ArrayList<>(); if (k == 0 || nums.length == 0) return res; Map
map = new HashMap<>(); for (int i : nums) { map.put(i, map.getOrDefault(i, 0) + 1); } PriorityQueue
pq = new PriorityQueue
(new Comparator
() { public int compare(Integer a, Integer b) { return -Integer.compare(map.get(a), map.get(b)); } }); for (int i : map.keySet()) { pq.offer(i); } for (int i = 0; i < k ; i++) { res.add(pq.poll()); } return res; }}

方法三:

MinHeap

前面一样,是miniHeap,队列最前是出现频率最小的element,而且一旦队列size大于K,直接POLL顶端,因为最小的不可能是要求的元素。

Time: 图 O(n), PQ入各种数字,然后保持K的大小应该是(n-k)lgK + KlgK(最后一个似乎可以省略,直接加PQ是可以的)

O(n + (n-KlgK)

public class Solution {    public List
topKFrequent(int[] nums, int k) { List
res = new ArrayList<>(); if (k == 0 || nums.length == 0) return res; Map
map = new HashMap<>(); for (int i : nums) { map.put(i, map.getOrDefault(i, 0) + 1); } PriorityQueue
pq = new PriorityQueue
(k, new Comparator
() { public int compare(Integer a, Integer b) { return Integer.compare(map.get(a), map.get(b)); } }); for (int i : map.keySet()) { pq.offer(i); if (pq.size() > k) { pq.poll(); } } res.addAll(pq); return res; }}

转载于:https://www.cnblogs.com/reboot329/p/6128334.html

你可能感兴趣的文章
JS与OC中的方法相互调用
查看>>
ASP.NET Core开发-使用Nancy框架
查看>>
沧海一声笑,移动应用的CRASH原因我找到! --记最新款数字化測试“星云測试“的使用攻略...
查看>>
常见浏览器兼容性问题与解决方式
查看>>
推荐系统依据近期浏览进行推荐
查看>>
工厂模式IDAL具体解释
查看>>
UVA - 673 Parentheses Balance
查看>>
数据库编程规范
查看>>
如何修改eclipse里面Android虚拟机的存放路径
查看>>
爬虫作业
查看>>
微软职位内部推荐-Senior Software Engineer
查看>>
c++11 智能指针 unique_ptr、shared_ptr与weak_ptr
查看>>
JavaScript跨域总结与解决办法(转)
查看>>
正则匹配
查看>>
关于架构的思考
查看>>
poj 1149 PIGS【最大流】
查看>>
Array.from()
查看>>
struts2+spring3+hibernate3整合(二)转载
查看>>
JVM-运行时数据区
查看>>
(解决)mysql1366中文显示错误的终极解决方案
查看>>