2025-04-04 12:05:49 +08:00
|
|
|
|
package heap;
|
|
|
|
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.PriorityQueue;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 题目: 347. 前 K 个高频元素 (topKFrequent)
|
|
|
|
|
* 描述:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
|
|
|
|
|
|
|
|
|
|
* 示例 1:
|
|
|
|
|
输入: nums = [1,1,1,2,2,3], k = 2
|
|
|
|
|
输出: [1,2]
|
|
|
|
|
|
|
|
|
|
* 链接:https://leetcode.cn/problems/top-k-frequent-elements/
|
|
|
|
|
*/
|
2025-07-13 22:02:52 +08:00
|
|
|
|
// 二刷不会
|
2025-04-04 12:05:49 +08:00
|
|
|
|
public class TopKFrequent {
|
2025-07-13 22:02:52 +08:00
|
|
|
|
|
2025-04-04 12:05:49 +08:00
|
|
|
|
public int[] topKFrequent(int[] nums, int k) {
|
2025-07-13 22:02:52 +08:00
|
|
|
|
HashMap<Integer,Integer> map=new HashMap<>();
|
|
|
|
|
int cnt=0;
|
|
|
|
|
PriorityQueue<int[]> minHeap=new PriorityQueue<>( //小根堆
|
|
|
|
|
(a,b) -> a[1]-b[1]
|
|
|
|
|
);
|
|
|
|
|
int[] temp;
|
|
|
|
|
int[] res=new int[k];
|
|
|
|
|
for (int i = 0; i < nums.length; i++) {
|
|
|
|
|
int cur=nums[i];
|
|
|
|
|
map.put(cur, map.getOrDefault(cur,0)+1);
|
|
|
|
|
}
|
|
|
|
|
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
|
|
|
|
|
if(cnt<k){
|
|
|
|
|
minHeap.add(new int[]{entry.getKey(),entry.getValue()});
|
|
|
|
|
cnt++;
|
|
|
|
|
}else {
|
|
|
|
|
temp=minHeap.peek();
|
|
|
|
|
if(entry.getValue()>temp[1]) {
|
|
|
|
|
minHeap.poll();
|
|
|
|
|
minHeap.add(new int[]{entry.getKey(),entry.getValue()});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
cnt=0;
|
|
|
|
|
for (int[] ints : minHeap) {
|
|
|
|
|
res[cnt++]=ints[0];
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public int[] topKFrequent2(int[] nums, int k) {
|
2025-04-04 12:05:49 +08:00
|
|
|
|
HashMap<Integer,Integer>map=new HashMap<>();
|
2025-07-13 22:02:52 +08:00
|
|
|
|
PriorityQueue<int[]> maxHeap = new PriorityQueue<>( //大根堆
|
2025-04-04 12:05:49 +08:00
|
|
|
|
(a, b) -> b[1] - a[1]);
|
|
|
|
|
int[] res=new int[k];
|
|
|
|
|
int i=0;
|
|
|
|
|
for (int num : nums) {
|
|
|
|
|
if(!map.containsKey(num))
|
|
|
|
|
map.put(num,1);
|
|
|
|
|
else
|
|
|
|
|
map.put(num,map.get(num)+1);
|
|
|
|
|
}
|
|
|
|
|
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
|
2025-07-13 22:02:52 +08:00
|
|
|
|
maxHeap.add(new int[]{entry.getKey(),entry.getValue()});
|
2025-04-04 12:05:49 +08:00
|
|
|
|
}
|
2025-07-13 22:02:52 +08:00
|
|
|
|
while (!maxHeap.isEmpty()) {
|
2025-04-04 12:05:49 +08:00
|
|
|
|
if(i<k)
|
2025-07-13 22:02:52 +08:00
|
|
|
|
res[i++] = maxHeap.poll()[0];
|
2025-04-04 12:05:49 +08:00
|
|
|
|
else break;
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
}
|