小根堆
- map统计词频
- 小根堆用出现的次数排序


小根堆容量是2,此刻已经满了, 后面要进来的数得过门槛才能进, 就是次数比堆顶的多, 堆顶的就是此时堆中出现次数最少的那个, 我秒掉最差我就能进来 所以这也是为什么要小根堆的原因


时间复杂度分析 建好计账表O(N) 堆大小K 一条记录进堆,调整的代价是logK 所以整体的时间复杂度O(N * logK)
public class Node {int num;int count;public Node(int num) {this.num = num;this.count = 1;}}public int[] topKFrequent(int[] nums, int k) {int[] result = new int[k];// map统计词频HashMap<Integer, Node> map = new HashMap<>();for (int num : nums) {if (!map.containsKey(num)) {map.put(num, new Node(num));} else {map.get(num).count++;}}// 小顶堆PriorityQueue<Node> minHeap = new PriorityQueue<>((o1, o2) -> o1.count - o2.count );for (Node node : map.values()) {if (minHeap.size() < k || minHeap.size() == k && node.count > minHeap.peek().count) {minHeap.add(node);}if (minHeap.size() > k) {minHeap.poll();}}for (int i = 0; i < k; i++) {result[i] = minHeap.poll().num;}return result;}
