题目描述
题目分析
- 这道题就是找出数组内出现频率前几的数组
- 那么首先要计算数字出现的频率
- 然后对频率进行排序,但是排序时不可打乱数字和频率的对应关系,找出前几大的数字
解法分析
代码
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> feq = new HashMap<>();
for(int num:nums){
feq.put(num, feq.getOrDefault(num, 0)+1);
}
List<Integer>[] buckets = new ArrayList[nums.length + 1];
for(int key : feq.keySet()){
int times = feq.get(key);
if(buckets[times] == null){
buckets[times] = new ArrayList<>();
}
buckets[times].add(key);
}
List<Integer> res = new ArrayList<>();
int len = buckets.length - 1;
for(int i = len;i >= 0 && res.size() < k; i--){
if(buckets[i] == null){
continue;
}
if(buckets[i].size() <= k-res.size()){
res.addAll(buckets[i]);
} else {
res.addAll(buckets[i].subList(0, k-res.size()));
}
}
int[] re = new int[k];
for(int i = 0;i<k;i++){
re[i] = (Integer)res.toArray()[i];
}
return re;
}
}
- 官方题解【注意:官方题解返回的是
List
但是实际题目要求返回的是 int[]
】
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
HashMap<Integer, Integer> count = new HashMap();
for (int n: nums) {
count.put(n, count.getOrDefault(n, 0) + 1);
}
PriorityQueue<Integer> heap =
new PriorityQueue<Integer>((n1, n2) -> count.get(n1) - count.get(n2));
for (int n: count.keySet()) {
heap.add(n);
if (heap.size() > k)
heap.poll();
}
List<Integer> top_k = new LinkedList();
while (!heap.isEmpty())
top_k.add(heap.poll());
Collections.reverse(top_k);
return top_k;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/top-k-frequent-elements/solution/qian-k-ge-gao-pin-yuan-su-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。