前K个高频元素

「前 K 个高频元素」问题的解决方案,采用桶排序思想,主要分为三个步骤:

  1. 统计频率:遍历数组,使用 Map 统计每个元素的出现次数,并记录最大出现次数。
  2. 构建桶:根据最大出现次数创建桶数组,将相同频率的元素放入同一个桶中。
  3. 收集结果:从高频到低频遍历桶,收集元素直到获得前 K 个高频元素。

时间复杂度为 O(n),空间复杂度为 O(n),

javascript 复制代码
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 = []
  // 注意题目保证答案唯一,一定会出现某次 push 后 ans.length 恰好等于 k 的情况
  for (let i = maxCnt; ans.length < k; i--) {
    ans.push(...buckets[i])
  }
  return ans
}

console.log(topKFrequent([1, 1, 1, 2, 2, 3], 2))
相关推荐
hhhjhl1 小时前
Protobuf.js 跨端三方库仓颉适配全流程
javascript·网络·udp
康小汪1 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
学逆向的1 小时前
C 堆区内存管理
c语言·开发语言·网络安全
huoyueyi1 小时前
《融天AI-APP从0到1开发实录》
开发语言·lua
智能运维指南2 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
OpenAnolis小助手3 小时前
PHP 两个严重漏洞曝光,龙蜥社区 24 小时完成 3 版本修复
开发语言·操作系统·php·龙蜥社区
白山编程大哥3 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
阿尼卡~4 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows
Flynt4 小时前
我把热榜那篇"禁用 axios"逐条实测了一遍:结论大体对,坑在它没讲的地方
前端·javascript·axios
Csvn5 小时前
bundle优化
前端