package com.zmz.algorithm.stackQueue;
import java.util.*;
/**
* @author 张明泽
* Create by 2022/6/1 22:49
* 前k个高频元素
* LeetCode-347
*/
public class HighFrequencyElements {
public static void main(String[] args) {
int[] nums = {1,1,1,2,2,3};
int[] result = topFrequent(nums,2);
System.out.println(Arrays.toString(result));
}
/**
* 利用优先队列 为了把频率高的排序而且还能获取元素值
* 优先队列PriorityQueue是Queue接口的实现,可以对其中元素进行排序.通过堆实现
*/
public static int[] topFrequent(int[] nums, int k) {
HashMap<Integer,Integer> hashMap = new HashMap<>();
for (int num : nums) {
hashMap.put(num,hashMap.getOrDefault(num,0) + 1);
}
// entrySet() 返回此映射中包含的映射的 Set 视图。
// Set 视图意思是 HashMap 中所有的键值对都被看作是一个 set 集合。
Set<Map.Entry<Integer,Integer>> setView = hashMap.entrySet();
// 优先级队列默认是升序,但传的自定义类型,需要自定义比较规则.默认为升序,返回值 等于0、小于0,都不改变,大于0时交换.
PriorityQueue<Map.Entry<Integer,Integer>> queue = new PriorityQueue<>(((o1, o2) -> o1.getValue() - o2.getValue()));
for (Map.Entry<Integer, Integer> set : setView) {
queue.offer(set);
if (queue.size() > k) {
queue.poll();
}
}
int[] result = new int[queue.size()];
for (int i = 0; i < result.length; i++) {
result[i] = queue.poll().getKey();
}
return result;
}
}
最后修改:2022 年 06 月 02 日 10 : 27 AM
© 允许规范转载