Skip to main content

前-k-个高频元素

题目

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

  • 1 <= nums.length <= 105
  • k 的取值范围是 [1, 数组中不相同的元素的个数]
  • 题目数据保证答案唯一, 换句话说, 数组中前 k 个高频元素的集合是唯一的
  • 你所设计算法的时间复杂度必须优于 O(nlogn), 其中 n 是数组大小
示例

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

输出: [1,2]

题解

使用优先队列, 这里以大顶堆为例, 但这种方式(不管是大顶堆还是小顶堆), 时间复杂度都是 O(NlogK).

/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var topKFrequent = function (nums, k) {
const map = new Map()
const pq = new PriorityQueue()
const res = []

// 先写个 hashmap, k-v 为: 元素-元素的出现次数
for (const num of nums) {
if (map.has(num)) {
map.set(num, map.get(num) + 1)
} else {
map.set(num, 1)
}
}

// 将 [元素的出现次数, 元素] 放到优先队列中
map.forEach((val, key) => pq.offer([val, key]))

// 找出前 k 个高频元素, 就让大顶堆依次 poll 即可
for (let i = 0; i < k; i++) {
res.push(pq.poll()[1])
}

return res
}