347. 前 K 个高频元素

class Solution {public int[] topKFrequent(int[] nums, int k) {if (nums == null || nums.length == 0 || k < 1) return new int[0];Map<Integer, Element> map = new HashMap();PriorityQueue<Element> pq = new PriorityQueue<>((e1, e2) -> e2.freq - e1.freq);for (int n : nums) {if (map.containsKey(n)) {map.get(n).incr();} else {map.put(n, new Element(n, 1));}}for (Element e : map.values()) {pq.add(e);}int[] res = new int[k];for (int i = 0; i < k; i++) {res[i] = pq.poll().val;}return res;}public class Element {public int val;public int freq;public Element(int val, int freq) {this.val = val;this.freq = freq;}public void incr() {freq++;}}}
使用**大顶堆**优化下:
class Solution {public int[] topKFrequent(int[] nums, int k) {if (nums == null || nums.length == 0 || k < 1) return new int[0];Map<Integer, Integer> map = new HashMap();PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>((e1, e2) -> e2.getValue() - e1.getValue());for (int n : nums) {map.put(n, map.getOrDefault(n, 0) + 1);}for (Map.Entry<Integer, Integer> e : map.entrySet()) {pq.add(e);}int[] res = new int[k];for (int i = 0; i < k; i++) {res[i] = pq.poll().getKey();}return res;}}
使用小顶堆
class Solution {public int[] topKFrequent(int[] nums, int k) {if (nums == null || nums.length == 0 || k < 1) return new int[0];Map<Integer, Integer> map = new HashMap();PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>((e1, e2) -> e1.getValue() - e2.getValue());for (int n : nums) {map.put(n, map.getOrDefault(n, 0) + 1);}for (Map.Entry<Integer, Integer> e : map.entrySet()) {pq.add(e);if (pq.size() == k + 1) pq.remove();}int[] res = new int[k];for (int i = 0; i < k; i++) {res[i] = pq.poll().getKey();}return res;}}
