LeetCode算法学习之前K个高频元素
完整代码实现
class Solution {public int[] topKFrequent(int[] nums, int k) {// 1. 统计频率Map<Integer, Integer> frequencyMap = new HashMap<>();for (int num : nums) {frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);}// 2. 使用最小堆(按频率排序)PriorityQueue<Integer> minHeap = new PriorityQueue<>((a, b) -> frequencyMap.get(a) - frequencyMap.get(b));// 3. 维护堆的大小为kfor (int num : frequencyMap.keySet()) {minHeap.offer(num);if(minHeap.size() > k) {minHeap.poll(); // 移除频率最小的元素}}// 4. 提取结果int[] result = new int[k];for (int i = 0; i < k; i++) {result[i] = minHeap.poll();}return result;}
}解题思路:
核心思路
1. 统计频率:遍历数组,用哈希表记录每个元素的出现次数
2. 维护前 K 个高频元素:使用最小堆(优先队列)动态维护当前频率最高的 k 个元素
堆中按频率升序排列,堆顶是当前 k 个元素中频率最小的
当堆大小超过 k 时,移除堆顶元素(淘汰频率最低的)
3. 提取结果:最后堆中剩余的 k 个元素即为答案
