前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))
相关推荐
denlaku1 分钟前
JDK 12 新特性详解
java·开发语言
鬼手点金5 分钟前
opencode-全能开发者配置
java·linux·服务器·前端·javascript·学习·前向传播
Nebula_g5 分钟前
JavaSE拓展:可变参数
java·开发语言·算法·安全·javase·可变参数
溪语流沙7 分钟前
【Web全栈进阶】Alembic数据库迁移:改表结构不再删库
前端·数据库·python·elasticsearch·postgresql
AI你一生一世13 分钟前
当构建工具成为基础设施:从 Tailwind 被收购谈起,前端工具链的“归属”难题
前端·构建工具·tailwind css·前端工具链·开源软件收购·技术中立性·前端基础设施
_zxd21 分钟前
TypeScript 类型树
前端·typescript
炸鸡叔41 分钟前
我做了 BotBus:从手机续聊本地 Agent,查看文件和终端
前端·后端
anew___44 分钟前
《从零手写操作系统 (30):环境变量与进程上下文——export/unset与继承语义》
java·开发语言·网络·jvm·算法
骑着蜗牛撵大象3271 小时前
多 Agent 串行流水线:把一个任务拆成可重试、可续跑的 Pipeline 节点链
前端·langchain