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; } }