LeetCode 347 – 前 K 个高频元素

题目描述

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

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

题目分析

先统计出每个元素出现的次数,再使用优先队列维护 k 个最大次数的元素。
时间复杂度 O(n * log k)

Java

public int[] topKFrequent(int[] nums, int k) {
    Map<Integer, Integer> map = new HashMap<>();
    Queue<Integer> queue = new PriorityQueue<>((o1, o2) -> Integer.compare(map.getOrDefault(o1, 0), map.getOrDefault(o2, 0)));
    for (int n : nums) {
        map.put(n, map.getOrDefault(n, 0) + 1);
    }
    for (int n : map.keySet()) {
        queue.offer(n);
        if (queue.size() > k) {
            queue.poll();
        }
    }
    int size = queue.size();
    int[] ans = new int[size];
    for (int i = 0; i < size; i++) {
        ans[i] = queue.poll();
    }
    return ans;
}

Kotlin

fun topKFrequent(nums: IntArray, k: Int): IntArray {
    val map = HashMap<Int, Int>()
    val queue = PriorityQueue<Int> { o1, o2 -> Integer.compare(map.getOrDefault(o1, 0), map.getOrDefault(o2, 0)) }
    for (n in nums) {
        map[n] = (map[n] ?: 0) + 1
    }
    for (n in map.keys) {
        queue.offer(n)
        if (queue.size > k) {
            queue.poll()
        }
    }

    return queue.toIntArray()
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部