LeetCode347:前 K 个高频元素

题目描述:

 

解题思路:

遇到这种TopK问题,我首先想到的是利用大顶堆或者小顶堆,结合本题中的要求,堆里面存储内容肯定是和元素出现频率有关的,此时,如果存储的是元素频率,那么无法根据频率知道对应的元素,所以堆里面应该存储出现频率前K高的元素。另外在遍历数组时候,需要记录元素出现的频率,为了能够快速得到元素出现的频率,可以利用HashMap,以元素为key,以元素对应的频率为value,将其存储在HashMap里面。具体代码如下:

 1 import java.util.*;
 2 
 3 class Solution {
 4     public int[] topKFrequent(int[] nums, int k) {
 5         int[] ans = new int[k];
 6         int len = nums.length;
 7         if( k > len || len == 0 || k == 0) return ans;
 8         HashMap<Integer, Integer> map = new HashMap<>();
 9         for(int num : nums){
10             map.put(num, map.getOrDefault(num,0)+1);
11         }
12 PriorityQueue<Integer> heap = new PriorityQueue<Integer>((o1,o2)->(map.get(o1) - map.get(o2))); //以元素出现的频率为依据构建大顶堆,将对应的元素存储到堆里面 13 14 for(int key : map.keySet()){ 15 heap.add(key); 16 if(heap.size() > k){ 17 heap.poll(); 18 } 19 } 20 21 int i = 0; 22 while(!heap.isEmpty()){ 23 ans[i] = heap.poll(); 24 i++; 25 } 26 return ans; 27 } 28 }

 

posted @ 2020-05-10 21:06  寻找最优解  阅读(136)  评论(0编辑  收藏  举报