题目描述
给你一个整数数组 nums 和一个整数 k,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 进阶:你所设计算法的时间复杂度 必须 优于 O(n log n),其中 n 是数组大小。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
思路&js代码
1、桶排序
var topKFrequent = function(nums, k) {
// 第一步:统计每个元素的出现次数
const cnt = new Map();
for (const x of nums) {
cnt.set(x, (cnt.get(x) ?? 0) + 1);
}
const maxCnt = Math.max(...cnt.values());
// 第二步:把出现次数相同的元素,放到同一个桶中
const buckets = Array.from({ length: maxCnt + 1 }, () => []);
for (const [x, c] of cnt.entries()) {
buckets[c].push(x);
}
// 第三步:倒序遍历 buckets,把出现次数前 k 大的元素加入答案
const ans = [];
for (let i = maxCnt; i >= 0 && ans.length < k; i--) {
ans.push(...buckets[i]);
}
return ans;
};