力扣练习之前 K 个高频元素

我爱海鲸 2023-03-22 21:06:37 暂无标签

简介中级算法、排序和搜索

原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-medium/xvzpxi/

解法一:

class Solution {
    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);
        }
        PriorityQueue<int[]> queue = new PriorityQueue<int[]>((a,b) -> b[1] - a[1]);
        for (int key : map.keySet()) {
            queue.add(new int[]{key,map.get(key)});
        }
        int[] res = new int[k];
        for (int i = 0 ; i < k ; i++) {
            res[i] = queue.poll()[0];
        }
        return res;
    }
}

思路:最大堆解决,我们首先通过一个map统计出所有元素出现的次数,然后将map中每一对(key,map.get(key))作为一个数组存入到最大堆中,最后我们取出最大堆中的前k个元素即可(因为取出来数组且数组中有两个元素,那么我们去数组中的第一个元素就好了)。

解法二:

class Solution {
    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);
        }
        PriorityQueue<int[]> queue = new PriorityQueue<int[]>((a,b) -> a[1] - b[1]);
        for (int key : map.keySet()) {
            queue.add(new int[]{key,map.get(key)});
            if (queue.size() > k) {
                queue.poll();
            }
        }
        int[] res = new int[k];
        int index = k-1;
        while (!queue.isEmpty()) {
            res[index--] = queue.poll()[0];
        }
        return res;
    }
}

思路:解法一中我们使用最大堆来完成了此题的解,其实我们也可以使用最小堆来完成。首先统计数组元素的个数,然后放到最小堆中,这里需要注意一下的是我们只需要保存k个元素,所以多余的元素我们将其去掉即可。

你好:我的2025