Algorithm/src/main/java/heap/TopKFrequent.java
2025-07-13 22:02:52 +08:00

77 lines
2.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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/
*/
// 二刷不会
public class TopKFrequent {
public int[] topKFrequent(int[] nums, int k) {
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) {
HashMap<Integer,Integer>map=new HashMap<>();
PriorityQueue<int[]> maxHeap = new PriorityQueue<>( //大根堆
(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()) {
maxHeap.add(new int[]{entry.getKey(),entry.getValue()});
}
while (!maxHeap.isEmpty()) {
if(i<k)
res[i++] = maxHeap.poll()[0];
else break;
}
return res;
}
}