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
赏杯咖啡喝 谢谢您~