Leetcode: Top K Frequent Elements
生活随笔
收集整理的這篇文章主要介紹了
Leetcode: Top K Frequent Elements
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Given 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.
很像majority element III, 但是那道題有O(k) extra space的限制,這里沒有。有任意extra space, 同時知道elem range情況下,bucket sort最節(jié)省時間
語法上注意第5行,建立一個ArrayList的array,后面沒有泛型generic
Time Complexity: O(N)
1 public class Solution { 2 public List<Integer> topKFrequent(int[] nums, int k) { 3 List<Integer> res = new ArrayList<Integer>(); 4 Map<Integer, Integer> freqMap = new HashMap<Integer, Integer>(); 5 ArrayList<Integer>[] bucket = new ArrayList[nums.length+1]; 6 7 for (int elem : nums) { 8 if (freqMap.containsKey(elem)) { 9 freqMap.put(elem, freqMap.get(elem)+1); 10 } 11 else { 12 freqMap.put(elem, 1); 13 } 14 } 15 for (int key: freqMap.keySet()) { 16 int freq = freqMap.get(key); 17 if (bucket[freq] == null) { 18 bucket[freq] = new ArrayList<Integer>(); 19 } 20 bucket[freq].add(key); 21 } 22 23 for (int i=bucket.length-1; i>=0 && res.size()<k; i--) { 24 if (bucket[i] != null) { 25 res.addAll(bucket[i]); 26 } 27 } 28 return res; 29 } 30 }?
方法2: MaxHeap,?用map.entrySet(), return Map.Entry type, 可以調(diào)用getKey() 和 getValue()
Time Complexity: O(NlogN)
1 public class Solution { 2 public List<Integer> topKFrequent(int[] nums, int k) { 3 List<Integer> res = new ArrayList<Integer>(); 4 Map<Integer, Integer> freqMap = new HashMap<Integer, Integer>(); 5 6 for (int elem : nums) { 7 if (freqMap.containsKey(elem)) { 8 freqMap.put(elem, freqMap.get(elem)+1); 9 } 10 else { 11 freqMap.put(elem, 1); 12 } 13 } 14 15 Comparator<Map.Entry<Integer, Integer>> comp = new Comparator<Map.Entry<Integer, Integer>>() { 16 public int compare(Map.Entry<Integer, Integer> entry1, Map.Entry<Integer, Integer> entry2) { 17 return entry2.getValue() - entry1.getValue(); 18 } 19 }; 20 21 PriorityQueue<Map.Entry<Integer, Integer>> maxHeap = new PriorityQueue<Map.Entry<Integer, Integer>>(11, comp); 22 23 for (Map.Entry<Integer, Integer> each : freqMap.entrySet()) { 24 maxHeap.offer(each); 25 } 26 27 for (int i=1; i<=k; i++) { 28 res.add(maxHeap.poll().getKey()); 29 } 30 return res; 31 } 32 }?
總結(jié)
以上是生活随笔為你收集整理的Leetcode: Top K Frequent Elements的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kafka深入理解-2:Kafka的Lo
- 下一篇: 运维利器-ClusterShell集群管