题目
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
提示:
- 1 <= nums.length <= 10^5
- k 的取值范围是 [1, 数组中不相同的元素的个数] 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的 进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/top-k-frequent-elements 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
JS实现
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var topKFrequent = function (nums, k) {
const result = [];
// 使用hashmap统计每个数字出现的次数
const hashmap = new Map();
for (let num of nums) {
if (!hashmap.has(num)) {
hashmap.set(num, 0);
}
hashmap.set(num, hashmap.get(num) + 1);
}
// 桶排序,将频率作为数组下标,放入第i个桶中
const buckets = new Array(nums.length + 1);
for (let [key, value] of hashmap) {
if (!buckets[value]) {
buckets[value] = [];
}
buckets[value].push(key);
}
// 遍历每一个桶(倒序遍历)
for (let i = buckets.length - 1; i >= 0 & result.length < k; i--) {
// 如果桶中有数字
if (buckets[i]) {
result.push(...buckets[i]);
}
}
return result;
};