LeetCode-347 出现频率最多的 k 个数

leetcode-347. Top K Frequent Elements
本文答案参考自leetcode评论区

  • 解法一:桶排序
时间复杂度O(n)
class Solution {
    public List topKFrequent(int[] nums, int k) {
        Map map = new HashMap<>();
        for(int n : nums){
            map.put(n,map.getOrDefault(n,0)+1);
        }
        List[] 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 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 topKFrequent(int[] nums, int k) {
        Map map = new HashMap<>();
        for(int n : nums){
            map.put(n,map.getOrDefault(n,0)+1);
        }
        PriorityQueue> maxHeap = new PriorityQueue<>(
        //重写compare
        //     new Comparator>(){
        //     @Override
        //     public int compare(Map.Entry a,Map.Entry b){
        //         return b.getValue()-a.getValue();
        //     }
        // }
        //lamda表达式
        (a,b)->(b.getValue()-a.getValue())
        );
        for(Map.Entry entry : map.entrySet()){
            maxHeap.add(entry);
        }
        List res = new ArrayList<>();
        for(int i=0; i

你可能感兴趣的:(算法,leetcode)