Java 求解前 K 个高频元素

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 求解前 K 个高频元素相关的知识,希望对你有一定的参考价值。

一、题目

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

二、优先级队列题解

题目要求得出现频率前 k 高的元素,所以需要求得:

(1)统计元素出现的频率
(2)对频率排序
(3)找出前 K 个高频元素

(1)统计元素的频率,可以采用map记录

(2)对频率排序,可以利用优先级队列对其频率进行排序

优先级队列:就是堆
求前K高频元素:可以对队列从大到小排序

(3)遍历找出前K高频元素

三、代码

import java.util.*;

class Solution 
    public int[] topKFrequent(int[] nums, int k) 
        Map<Integer, Integer> map = new HashMap<>();
        //统计元素出现的频率
        for (int i : nums) 
            if (map.containsKey(i)) 
                map.put(i, map.get(i) + 1);
             else 
                map.put(i, 1);
            
        
        //自定义优先级队列,按照频率进行排序,降序
        Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() 
            @Override
            public int compare(Integer o1, Integer o2) 
                return map.get(o2) - map.get(o1);
            
        );
        //将所有数字放入队列
        for (int i : map.keySet()) 
            queue.add(i);
        
        int[] res = new int[k];
        //取出前k个元素
        for (int i = 0; i < k; i++) 
            res[i] = queue.poll();
        
        return res;
    

四、总结

求频率,考虑 Map

前K高频,考虑优先级队列

同时注意对优先级队列重排序的方式:

//自定义优先级队列,按照频率进行排序,降序
Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() 
    @Override
    public int compare(Integer o1, Integer o2) 
        return map.get(o2) - map.get(o1);
    
);

或者精简写法:

Queue<Integer> queue = new PriorityQueue<>(
            (a,b)->Integer.compare(map.get(b),map.get(a)));

以上是关于Java 求解前 K 个高频元素的主要内容,如果未能解决你的问题,请参考以下文章

力扣刷题:前 K 个高频元素(java实现)

前 K 个高频元素--力扣

LeetCode前 K 个高频元素(堆)

代码随想录算法训练营第13天 | ● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 ● 总结

前K个高频单词--力扣

347. 前 K 个高频元素