Algorithm/src/main/java/heap/TopKFrequent.java

77 lines
2.2 KiB
Java
Raw Normal View History

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