解法一

先统计出现频率,然后维护一个大小为k的优先队列,保留频率前k大的元素。

  1. import java.util.Comparator;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.PriorityQueue;
  5. import java.util.Queue;
  6. class Solution {
  7. public int[] topKFrequent(int[] nums, int k) {
  8. // key: 元素值
  9. // value: 出现频率
  10. Map<Integer, Integer> count = new HashMap<>();
  11. for (int i : nums) {
  12. count.put(i, count.getOrDefault(i, 0) + 1);
  13. }
  14. System.out.println(count);
  15. Comparator<int[]> queueComparator = new Comparator<int[]>() {
  16. @Override
  17. public int compare(int[] o1, int[] o2) {
  18. return o1[1] - o2[1];
  19. }
  20. };
  21. // 优先队列, 保留前k个的元素
  22. Queue<int[]> queue = new PriorityQueue<>(queueComparator);
  23. for (Map.Entry<Integer, Integer> entry : count.entrySet()) {
  24. int key = entry.getKey();
  25. int value = entry.getValue();
  26. if (queue.size() < k) {
  27. queue.offer(new int[] { key, value });
  28. } else if (queue.peek()[1] < value) {
  29. queue.poll();
  30. queue.offer(new int[] { key, value });
  31. }
  32. }
  33. int[] ans = new int[k];
  34. for (int i = 0; i < k; ++i) {
  35. ans[i] = queue.poll()[0];
  36. }
  37. return ans;
  38. }
  39. }