leetcode [347]Top K Frequent Elements
Given a non-empty array of integers, return the k most frequent elements.
Example 1:
Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]
Example 2:
Input: nums = [1], k = 1
Output: [1]
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.
题目大意:
找出出现频次最高的k个元素。
解法:
可以想到存储元素和元素出现的次数需要使用一个HashMap来存储,然后hashMap中的entry需要使用一个容器使用entry中的value值进行排序。这里可以使用PriorityQueue。这里我们重写了Comparator,为了使得出现频率大的元素排在前面。
java:
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;
}
}
还可以使用桶排序的思想,将出现频次相同的放到一个桶中,然后从出现频次高的桶向出现频次低的遍历:
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;
}
}

浙公网安备 33010602011771号