leetcode 347. Top K Frequent Elements | 347. 前 K 个高频元素(大根堆)

布满荆棘的人生 2022-08-30 00:49 251阅读 0赞

题目

https://leetcode.com/problems/top-k-frequent-elements/
在这里插入图片描述

题解

参考:leetcode 215. Kth Largest Element in an Array | 215. 数组中的第K个最大元素(Java)

  1. class Solution {
  2. public static class HeapNode {
  3. int num;
  4. int count;
  5. public HeapNode(int num, Integer count) {
  6. this.num = num;
  7. this.count = count;
  8. }
  9. }
  10. public int[] topKFrequent(int[] nums, int k) {
  11. HashMap<Integer, Integer> map = new HashMap<>();
  12. for (int n : nums) {
  13. if (!map.containsKey(n)) map.put(n, 1);
  14. else map.put(n, map.get(n) + 1);
  15. }
  16. // 建大根堆
  17. int heapSize = map.size();
  18. HeapNode[] heap = new HeapNode[heapSize];
  19. int j = 0;
  20. for (int key : map.keySet())
  21. heap[j++] = new HeapNode(key, map.get(key));
  22. for (int i = heapSize - 1; i >= 0; i--) // 自下向上建堆 可证复杂度为O(n)
  23. heapify(heap, i, heapSize);
  24. // Top k
  25. int[] result = new int[k];
  26. int pos = 0;
  27. for (int i = 0; i < k; i++) {
  28. result[pos++] = heap[0].num;
  29. swap(heap, 0, --heapSize);
  30. heapify(heap, 0, heapSize);
  31. }
  32. return result;
  33. }
  34. public void heapify(HeapNode[] heap, int i, int heapSize) {
  35. int left = i * 2 + 1;
  36. while (left < heapSize) {
  37. int largest = left + 1 < heapSize && heap[left + 1].count > heap[left].count ? left + 1 : left; // 左右孩子较大者的下标
  38. largest = heap[largest].count > heap[i].count ? largest : i; // 两个孩子与父节点较大者的下标
  39. if (largest == i) break; // 不需要交换的情况
  40. swap(heap, largest, i);
  41. i = largest; // 更新i使其下沉
  42. left = 2 * i + 1;
  43. }
  44. }
  45. private void swap(HeapNode[] heap, int i, int j) {
  46. HeapNode tmp = heap[i];
  47. heap[i] = heap[j];
  48. heap[j] = tmp;
  49. }
  50. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,251人围观)

还没有评论,来说两句吧...

相关阅读