题目
给你一个整数数组 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… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
- 通过 Map 统计数组出现的次数;
- 将统计结果加入一个维护 k 个元素的小顶堆中,如果当前数字出现的次数大于堆顶元素则出队列,再将当前数字入队列;
- 将小顶堆中的元素取出并返回;
代码实现
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)
};
如有错误欢迎指出,欢迎一起讨论!