解法一
先统计出现频率,然后维护一个大小为k的优先队列,保留频率前k大的元素。
import java.util.Comparator;import java.util.HashMap;import java.util.Map;import java.util.PriorityQueue;import java.util.Queue;class Solution {public int[] topKFrequent(int[] nums, int k) {// key: 元素值// value: 出现频率Map<Integer, Integer> count = new HashMap<>();for (int i : nums) {count.put(i, count.getOrDefault(i, 0) + 1);}System.out.println(count);Comparator<int[]> queueComparator = new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[1] - o2[1];}};// 优先队列, 保留前k个的元素Queue<int[]> queue = new PriorityQueue<>(queueComparator);for (Map.Entry<Integer, Integer> entry : count.entrySet()) {int key = entry.getKey();int value = entry.getValue();if (queue.size() < k) {queue.offer(new int[] { key, value });} else if (queue.peek()[1] < value) {queue.poll();queue.offer(new int[] { key, value });}}int[] ans = new int[k];for (int i = 0; i < k; ++i) {ans[i] = queue.poll()[0];}return ans;}}
