leetcode-347. Top K Frequent Elements
本文答案参考自leetcode评论区
- 解法一:桶排序
时间复杂度O(n)
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(int n : nums){
map.put(n,map.getOrDefault(n,0)+1);
}
List<Integer>[] bucket = new ArrayList[nums.length+1];
for(int key : map.keySet()){
int freq = map.get(key);
if(bucket[freq]==null){
bucket[freq] = new ArrayList<>();
}
bucket[freq].add(key);
}
List<Integer> res = new ArrayList<>();
for(int i=bucket.length-1; i>0&&k>0; i--){
if(bucket[i]!=null){
res.addAll(bucket[i]);
k-=bucket[i].size();
}
}
return res;
}
}
- 解法二:堆排序,建立最大堆
java中PriorityQueue默认是实现最小堆,所以需要重写PriorityQueue中的compare方法,@Override也可以使用lamda表达式简化。
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(int n : nums){
map.put(n,map.getOrDefault(n,0)+1);
}
PriorityQueue<Map.Entry<Integer,Integer>> maxHeap = new PriorityQueue<>(
//重写compare
// new Comparator<Map.Entry<Integer,Integer>>(){
// @Override
// public int compare(Map.Entry<Integer,Integer> a,Map.Entry<Integer,Integer> b){
// return b.getValue()-a.getValue();
// }
// }
//lamda表达式
(a,b)->(b.getValue()-a.getValue())
);
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
maxHeap.add(entry);
}
List<Integer> res = new ArrayList<>();
for(int i=0; i<k; i++){
res.add(maxHeap.poll().getKey());
}
return res;
}
}