PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。

优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器Comparator)。

347. 前 K 个高频元素

image.png

  1. 要统计元素出现频率
  2. 对频率排序
  3. 找出前K个高频元素
  1. class Solution {
  2. public int[] topKFrequent(int[] nums, int k) {
  3. int[] result = new int[k];
  4. HashMap<Integer, Integer> map = new HashMap<>();
  5. for (int num : nums) {
  6. map.put(num, map.getOrDefault(num, 0) + 1);
  7. }
  8. Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
  9. // 根据map的value值正序排,相当于一个小顶堆
  10. PriorityQueue<Map.Entry<Integer, Integer>> queue = new PriorityQueue<>((o1, o2) -> o2.getValue() - o1.getValue());
  11. for (Map.Entry<Integer, Integer> entry : entries) {
  12. queue.offer(entry);
  13. if (queue.size() > k) {
  14. queue.poll();
  15. }
  16. }
  17. for (int i = k - 1; i >= 0; i--) {
  18. result[i] = queue.poll().getKey();
  19. }
  20. return result;
  21. }
  22. }