77 lines
2.2 KiB
Java
77 lines
2.2 KiB
Java
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;
|
||
}
|
||
}
|