【LeetCode】347.前K个高频元素

题目

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 10^5
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的

解答

源代码

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map occurences = new HashMap<>();

        for (int num : nums) {
            occurences.put(num, occurences.getOrDefault(num, 0) + 1);
        }

        PriorityQueue prio = new PriorityQueue<>(new Comparator() {
            public int compare(int[] n1, int[] n2) {
                return n1[1] - n2[1];
            }
        });

        for (Map.Entry entry : occurences.entrySet()) {
            int num = entry.getKey(), count = entry.getValue();

            if (prio.size() == k) {
                if (prio.peek()[1] < count) {
                    prio.poll();
                    prio.offer(new int[]{num, count});
                }
            } else {
                prio.add(new int[]{num, count});
            }
        }

        int[] res = new int[k];

        for (int i = 0; i < k; i++) {
            res[i] = prio.poll()[0];
        }

        return res;
    }
}

总结

用哈希表存储每个元素对应的出现频率,然后用一个优先队列作为小顶堆,存放“前K个高频元素”。

遍历哈希表,当堆中元素不足K时,可以直接放入;若堆中元素已等于K,那么将堆中出现频率最低的元素(也就是堆顶元素)和当前哈希表元素进行频率比较,如果哈希表元素更大,那就进行替换。

最终得到的堆中元素就是我们要找到前K个高频元素,然后我们用一个一维数组去存储它们。

你可能感兴趣的:(LeetCode,leetcode,算法,数据结构)