前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))
相关推荐
one31213 分钟前
高精度MEMS电容式倾角传感器:原理、结构与Python三维可视化
开发语言·python
计算机魔术师19 分钟前
英伟达两个月叫停360亿美元生意:芯片巨头怕了反垄断?
前端
程序员小八77722 分钟前
Go 语言特性
开发语言·后端·golang
创新技术阁28 分钟前
FastapiAdmin 前后端启动全流程详解
前端·后端·fastapi
七牛开发者34 分钟前
实测推荐 3 个 Skill,轻松上手 Codex 网页设计与交付流程
前端·javascript·后端
七牛开发者37 分钟前
拆解 dsh 系列:从源码和版本变化看 DeepSeek Harness 的设计取舍
前端·javascript·后端
谭光志1 小时前
如何从网站提取设计风格:DOM、计算样式与 DESIGN.md
前端·javascript·agent
深念Y1 小时前
登录日志与管理员审计日志存储决策
前端·arm开发·后端·微服务·云原生·架构
INGNIGHT1 小时前
1908 · 布尔表达式求值(stack单调栈&dfs)
开发语言·c++·算法
笨笨饿1 小时前
#121_图传中的H.364编码与MP4的联系
linux·运维·前端·单片机·嵌入式硬件·面试·职场和发展