[路飞]_LeetCode_347. 前 K 个高频元素

200 阅读1分钟

题目

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

示例 1:

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

示例 2:

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/to… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  1. 通过 Map 统计数组出现的次数;
  2. 将统计结果加入一个维护 k 个元素的小顶堆中,如果当前数字出现的次数大于堆顶元素则出队列,再将当前数字入队列;
  3. 将小顶堆中的元素取出并返回;

代码实现


var topKFrequent = function(nums, k) {
    //通过 Map 统计数组出现的次数;
    const map = new Map()
    nums.forEach(num => map.set(num, map.has(num) ? map.get(num) + 1 : 1))
    
    //将统计结果加入一个维护 k 个元素的小顶堆中
    const minQueue = new MinPriorityQueue()
    for ([key, value] of map) {
        if (minQueue.size() < k) {
            minQueue.enqueue(key, value)
        } else {
            //如果当前数字出现的次数大于堆顶元素则出队列,再将当前数字入队列
            if (minQueue.front()['priority'] < value) {
                minQueue.dequeue()
                minQueue.enqueue(key, value)
            }
        }
    }

    //将小顶堆中的元素取出并返回
    return minQueue.toArray().map(item => item.element)
};

如有错误欢迎指出,欢迎一起讨论!