一、题目
1、审题

2、分析
一个非空整形数组,返回数组中出现次数最多的 k 个数。 其中 1 <= k <= 不同的数值个数。
二、解答
1、思路
方法一、
① 新建一个 List<Integer, Integer>[] : 其中数组下标表示频率(count); List 为数字;
② 新建一个 Map<Integer, Integer>: 其中key: num; value: count;
③ 采用 Map 统计每个数字出现的频率; 遍历 Map 的key, 填充 List[] ;
④ List[] 的最后 k 个 元素即为所求。
public List<Integer> topKFrequent(int[] nums, int k) {
// index: count; value: nums
List<Integer>[] bucket = new List[nums.length + 1];
// key: num; value: count
HashMap<Integer, Integer> frequencyMap = new HashMap<>();
for(int n: nums)
frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
for(int key: frequencyMap.keySet()) {
int frequency = frequencyMap.get(key);
if(bucket[frequency] == null)
bucket[frequency] = new ArrayList<>();
bucket[frequency].add(key);
}
List<Integer> result = new ArrayList<>();
for(int pos = bucket.length - 1; pos >= 0 && result.size() < k; pos--) {
if(bucket[pos] != null)
result.addAll(bucket[pos]);
}
return result;
}
方法二、
采用 PriorityQueue 存储较小的数,则每次出队都是出去的最大数。则出队的数进行存储; 出队的 前 K 个即为所求。
public List<Integer> topKFrequent2(int[] nums, int k) {
// key: num; value: count
HashMap<Integer, Integer> frequencyMap = new HashMap<>();
for(int n: nums)
frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
PriorityQueue<Entry<Integer, Integer>> maxHeap = new PriorityQueue<>(new Comparator<Entry<Integer, Integer>>() {
@Override
public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
return o1.getKey() - o2.getKey();
}
});
for(Entry<Integer, Integer> entry: frequencyMap.entrySet())
maxHeap.add(entry);
List<Integer> result = new ArrayList<>();
while(result.size() < k) {
Entry<Integer, Integer> entry = maxHeap.poll();
result.add(entry.getKey());
}
return result;
}