【347】前K个高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
思路:元素和元素出现频次就可以借助Map结构,将输入数组元素作为KEY,出现频次作为value存入Map中,可以借助优先队列,使队列元素值在K内,然后后续元素可以把优先队列中频次最小的元素替代,
import java.util.*;
class Solution {
public int [] topKFrequent(int[] nums, int k) {
TreeMap<Integer, Integer> map = new TreeMap<>();
for(int num: nums){
if(map.containsKey(num)){
map.put(num, map.get(num) + 1);}
else{
map.put(num, 1);}
}
PriorityQueue<Integer> pq = new PriorityQueue<>
(new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return map.get(a) - map.get(b);
}
});//比较器,判断输入两个元素出现频次的大小,频次小的优先级高,往上浮
for(int key: map.keySet()){
if(pq.size() < k)
pq.add(key);//队列未满时直接添加进队列
else if(map.get(key) > map.get(pq.peek())){//队列满了,则看新添加元素是否比堆顶元素大
pq.remove();//若大,删去堆顶元素
pq.add(key);//加入新元素
}
}
LinkedList<Integer> res = new LinkedList<>();
while(!pq.isEmpty()){//将队列元素丢进链表中
res.add(pq.remove());}
int[] ret = new int[res.size()];
for(int i = 0 ; i < res.size() ; i ++){
ret[i] = res.get(i);}//以数组形式打印出来
return ret;
}
}