xiaobenchi

导航

数组中出现频率为前k的元素数组

数组中出现频率为前k的元素数组

这个题的作答的过程中,题解细节实现的收获远超于题解思路本身,做完之后我迫不及待的写下这个笔记。

题目描述

本题是来力扣的第347题

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

本题是移到medium的题,思路并不难,但是在具体的实现细节中,有很多的数据结构的应用,可以说是帮助我扫除了好几个知识点应用模糊的地方。

思路讲解

思路说明的过程也就是列举本题所涉及知识点的过程

  • 首先要用Map保存数组里元素的值和出现的次数,这里涉及到了getOrDefault函数的使用。

     map.put(num,map.getOrDefault(num,0)+1);
    
  • 然后建立优先队列(小根堆),由于保存前k个值

//构建小根堆
PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>(){
            public int compare(int[] m,int[] n){
                return m[1]-n[1];
            }
        });
  • 之后遍历map,根据map的遍历结果往优先队列中存放数据

    这里涉及到了map的遍历和优先队列的使用

 for(Map.Entry<Integer,Integer> entry : map.entrySet()){
           int num = entry.getKey(),count = entry.getValue();
           if(queue.size() == k){
               if(queue.peek()[1] < count){
                   queue.poll();
                   queue.offer(new int[]{num,count});
               }
           }else{
               queue.offer(new int[]{num,count});
           }
  • 最后,将队列中的元素放入结果数组

整体代码

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        if(nums == null || nums.length <= 1){
            return nums;
        }
        Map<Integer,Integer> map = new HashMap<>();
        for(int num:nums){
            map.put(num,map.getOrDefault(num,0)+1);
        }
        //小根堆
        //int[]的第一个元素代表数组的值,第二个元素代表该值出现的次数
        PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>(){
            public int compare(int[] m,int[] n){
                return m[1]-n[1];
            }
        });
       for(Map.Entry<Integer,Integer> entry : map.entrySet()){
           int num = entry.getKey(),count = entry.getValue();
           if(queue.size() == k){
               if(queue.peek()[1] < count){
                   queue.poll();
                   queue.offer(new int[]{num,count});
               }
           }else{
               queue.offer(new int[]{num,count});
           }
       }
       int[] ret = new int[k];
       for(int i = 0; i < k; i++){
           ret[i] = queue.poll()[0];
       }
       return ret;
    }
}

posted on 2022-05-17 16:25  小迟在努力  阅读(60)  评论(0)    收藏  举报