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
題目大意:排序
找出出現頻次最高的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; } }