栈与队列:求前 K 个高频元素

题目:347. 前 K 个高频元素

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

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

输入: nums = [1], k = 1
输出: [1]

思路

这道题目主要涉及到如下三块内容:

  • 要统计元素出现频率
  • 对频率排序
  • 找出前K个高频元素

对频率进行排序可以使用「优先级队列」。

优先级队列

一个披着队列外衣的堆,因为优先级队列对外接口只是从队头取元素,从队尾添加元素,再无其他取元素的方式,看起来就是一个队列。

而且优先级队列内部元素是自动依照元素的权值排列(默认顺序是升序,可自定义比较器)。

代码

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        int[] ans = new int[k];

        //统计元素出现频率
        Map<Integer,Integer> map = new HashMap<Integer, Integer>();
        for(int num:nums){
            map.put(num,map.getOrDefault(num,0)+1);
        }
        //对频率排序
        PriorityQueue<Map.Entry<Integer, Integer>> priorityQueue = new PriorityQueue<Map.Entry<Integer, Integer>>(new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            priorityQueue.add(entry);
        }
        // 找出前K个高频元素
        for(int i=0;i<k;i++){
            ans[i]=priorityQueue.remove().getKey();
        }

        return ans;
    }
}

Map的entrySet()

  • entrySet是Map中各个键值对映射关系的集合

  • Set<Entry<T,V>> entrySet(),Set里面的类型是Map.Entry

  • 可使用它对map进行遍历

posted @ 2021-04-16 18:25  当康  阅读(60)  评论(0编辑  收藏  举报