347. 前 K 个高频元素

image.png

  1. class Solution {
  2. public int[] topKFrequent(int[] nums, int k) {
  3. if (nums == null || nums.length == 0 || k < 1) return new int[0];
  4. Map<Integer, Element> map = new HashMap();
  5. PriorityQueue<Element> pq = new PriorityQueue<>((e1, e2) -> e2.freq - e1.freq);
  6. for (int n : nums) {
  7. if (map.containsKey(n)) {
  8. map.get(n).incr();
  9. } else {
  10. map.put(n, new Element(n, 1));
  11. }
  12. }
  13. for (Element e : map.values()) {
  14. pq.add(e);
  15. }
  16. int[] res = new int[k];
  17. for (int i = 0; i < k; i++) {
  18. res[i] = pq.poll().val;
  19. }
  20. return res;
  21. }
  22. public class Element {
  23. public int val;
  24. public int freq;
  25. public Element(int val, int freq) {
  26. this.val = val;
  27. this.freq = freq;
  28. }
  29. public void incr() {
  30. freq++;
  31. }
  32. }
  33. }

使用**大顶堆**优化下

  1. class Solution {
  2. public int[] topKFrequent(int[] nums, int k) {
  3. if (nums == null || nums.length == 0 || k < 1) return new int[0];
  4. Map<Integer, Integer> map = new HashMap();
  5. PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>((e1, e2) -> e2.getValue() - e1.getValue());
  6. for (int n : nums) {
  7. map.put(n, map.getOrDefault(n, 0) + 1);
  8. }
  9. for (Map.Entry<Integer, Integer> e : map.entrySet()) {
  10. pq.add(e);
  11. }
  12. int[] res = new int[k];
  13. for (int i = 0; i < k; i++) {
  14. res[i] = pq.poll().getKey();
  15. }
  16. return res;
  17. }
  18. }

使用小顶堆

  1. class Solution {
  2. public int[] topKFrequent(int[] nums, int k) {
  3. if (nums == null || nums.length == 0 || k < 1) return new int[0];
  4. Map<Integer, Integer> map = new HashMap();
  5. PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>((e1, e2) -> e1.getValue() - e2.getValue());
  6. for (int n : nums) {
  7. map.put(n, map.getOrDefault(n, 0) + 1);
  8. }
  9. for (Map.Entry<Integer, Integer> e : map.entrySet()) {
  10. pq.add(e);
  11. if (pq.size() == k + 1) pq.remove();
  12. }
  13. int[] res = new int[k];
  14. for (int i = 0; i < k; i++) {
  15. res[i] = pq.poll().getKey();
  16. }
  17. return res;
  18. }
  19. }