leetcode [347]Top K Frequent Elements

Given a non-empty array of integers, return the k most frequent elements.java

Example 1:ide

Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2] 

Example 2:spa

Input: nums = [1], k = 1 Output: [1]

Note: blog

  • 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.

题目大意:排序

找出出现频次最高的k个元素。element

解法:get

能够想到存储元素和元素出现的次数须要使用一个HashMap来存储,而后hashMap中的entry须要使用一个容器使用entry中的value值进行排序。这里可使用PriorityQueue。这里咱们重写了Comparator,为了使得出现频率大的元素排在前面。input

java:hash

class Solution {
    public List<Integer> topKFrequent(int[] nums, int k) {
        List<Integer>res=new ArrayList<>();
        PriorityQueue<Map.Entry<Integer,Integer>>q=new PriorityQueue<>(new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                return o2.getValue()-o1.getValue();
            }
        });

        Map<Integer,Integer>m=new HashMap<>();
        for (int num:nums){
            if (m.containsKey(num)) m.put(num,m.get(num)+1);
            else m.put(num,1);
        }

        for (Map.Entry entry:m.entrySet()){
            q.add(entry);
        }
        for (int i=0;i<k;i++){
            res.add(q.poll().getKey());
        }
        return res;
    }
}

还可使用桶排序的思想,将出现频次相同的放到一个桶中,而后从出现频次高的桶向出现频次低的遍历:it

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

        return res;
    }
}
相关文章
相关标签/搜索