题目描述:
解题思路:
遇到这种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 }