【95.前 K 个高频元素】

85 阅读1分钟

题目

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

 

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]

题解

方式一:哈希表 + 堆

public int[] topKFrequent(int[] nums, int k) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
    }
    
    // 也可以将Map.Entry放到List中按value排序,取前K个
    // ArrayList<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
    // list.sort((e1, e2) -> e2.getValue().compareTo(e1.getValue()));
    PriorityQueue<Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>((a, b) -> a.getValue() - b.getValue());
    for (Map.Entry<Integer, Integer> entry: map.entrySet()) {
        if (minHeap.size() < k) {
            minHeap.offer(entry);
        } else if (entry.getValue() > minHeap.peek().getValue()) {
            minHeap.poll();
            minHeap.offer(entry);
        }
    }

    int[] result = new int[k];
    int i = 0;
    while (!minHeap.isEmpty()) {
        result[i++] = minHeap.poll().getKey();
    }
    return result;
}

总结

数据结构:哈希表