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;
    }
}
相關文章
相關標籤/搜索