347. Top K Frequent Elements**

来源:互联网 发布:ubuntu配置tomcat环境 编辑:程序博客网 时间:2024/06/05 05:41

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

For example,
Given [1,1,1,2,2,3] and k = 2, return [1,2].

Note: 

  • 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.
    public List<Integer> topKFrequent(int[] nums, int k) {        List<Integer>[] bucket = new List[nums.length+1];        Map<Integer, Integer> map = new HashMap<Integer, Integer>();        for(int n:nums){            map.put(n, map.getOrDefault(n,0)+1);        }        for(int key: map.keySet()){            int frequency = map.get(key);            if(bucket[frequency]==null) bucket[frequency] = new ArrayList<>();            bucket[frequency].add(key);        }        List<Integer> result = new ArrayList<>();        for(int pos = bucket.length-1;pos>=0&&result.size()<k;pos--){            if(bucket[pos]!=null){                result.addAll(bucket[pos]);            }        }        return result;    }
Maxheap:
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<>((a,b)->(b.getValue()-a.getValue()));        for(Map.Entry<Integer,Integer> entry: map.entrySet()){            maxHeap.add(entry);        }                List<Integer> res = new ArrayList<>();        while(res.size()<k){            Map.Entry<Integer, Integer> entry = maxHeap.poll();            res.add(entry.getKey());        }        return res;    }
什么意思:
PriorityQueue<Map.Entry<Integer, Integer>> maxHeap =                          new PriorityQueue<>((a,b)->(b.getValue()-a.getValue()));

Treemap:
    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);        }                TreeMap<Integer, List<Integer>> freqMap = new TreeMap<>();        for(int num : map.keySet()){           int freq = map.get(num);           if(!freqMap.containsKey(freq)){               freqMap.put(freq, new LinkedList<>());           }           freqMap.get(freq).add(num);        }                List<Integer> res = new ArrayList<>();        while(res.size()<k){            Map.Entry<Integer, List<Integer>> entry = freqMap.pollLastEntry();            res.addAll(entry.getValue());        }        return res;    }
总结:根据红黑树进行实现,根据key的自然顺序进行排序。

0 0
原创粉丝点击