当前位置: 首页 > news >正文

千问 LeetCode 2862. 完全子集的最大元素和 TypeScript实现

TypeScript 的实现其实就是给 JavaScript 版本加上严格的类型约束。逻辑完全一致,但 TS 的代码在规范性和可维护性上会更好。

TypeScript 代码实现

function maximumSum(nums: number[]): number {
let maxSum = 0;
const n = nums.length;
// 使用 Map 记录每个“无平方因子数”对应的元素和
const sumMap = new Map<number, number>();

for (let i = 0; i < n; i++) {
// 获取当前下标 (i + 1) 对应的无平方因子数
const core = getCore(i + 1);

// 将当前元素值累加到对应的组中
const currentSum = (sumMap.get(core) || 0) + nums[i];
sumMap.set(core, currentSum);

// 实时更新最大值
maxSum = Math.max(maxSum, currentSum);
}

return maxSum;
};

// 计算数字 n 的“无平方因子数”
const getCore = (n: number): number => {
let core = 1;
// 质因数分解
for (let i = 2; i * i <= n; i++) {
let count = 0;
// 统计质因数 i 的个数
while (n % i === 0) {
count++;
n = Math.floor(n / i); // 记得向下取整
}
// 如果质因数个数是奇数,则保留一个 i 到结果中
if (count % 2 === 1) {
core *= i;
}
}
// 如果最后剩下的 n 大于 1,说明它是一个大质因数,且个数为 1(奇数)
if (n > 1) {
core *= n;
}
return core;
};

另一种更巧妙的解法(枚举法)

除了提取核心数,这道题还有一种非常巧妙的枚举思路。

根据数学规律,任意一个“完全子集”的下标都可以表示为 {x, 4x, 9x, 16x...}(即 k² * x)。我们可以直接枚举这个基数 x(x 从 1 遍历到 n),然后不断累加 x * 1², x * 2², x * 3²... 对应的数组元素,直到下标超出数组长度为止。

这种方法不需要做质因数分解,代码会更加简洁:

function maximumSum(nums: number[]): number {
let maxSum = 0;
const n = nums.length;

// 枚举基数 x (从 1 到 n)
for (let x = 1; x <= n; x++) {
let currentSum = 0;
// 枚举平方数倍数 k²,计算下标 x * k²
for (let k = 1; k * k * x <= n; k++) {
// 下标是 x * k * k,对应的数组索引需要减 1
currentSum += nums[x * k * k - 1];
}
// 实时更新最大值
maxSum = Math.max(maxSum, currentSum);
}

return maxSum;
};

复杂度与选择
* 提取核心数法:时间复杂度 O(N * √N),空间复杂度 O(N)(需要 Map 存储分组和)。
* 枚举基数法:时间复杂度同样是 O(N * √N)(调和级数推导),但空间复杂度是 O(1),且代码极其简短。

在面试或实际刷题中,如果你能快速推导出枚举法的规律,直接写第二种会非常加分!

http://www.jsqmd.com/news/925528/

相关文章:

  • Typed Assembly Language在密码学软件安全中的应用与优化
  • 真实Agent迭代案例,真正理解Harness工程
  • 如何快速实现人体姿态搜索:免费开源工具完整指南
  • 简单的软路由器Web端仿真启动
  • Arduino电子骰子:从随机数生成到嵌入式系统全流程实践
  • AcWing 2174:[模板] 费用流 ← Dinic / EK + SPFA
  • 终极指南:如何免费解锁Cursor AI Pro功能并突破使用限制
  • 五分钟入门强化学习PPO(Proximal Policy Optimization)
  • 2026PDF转Word免费方案详细教程:软件网页工具一看就会
  • LeetCode 每日一题笔记 日期:2026.05.31 题目:2126. 摧毁小行星
  • 多张图片转pdf的免费工具推荐?2026图片合并转PDF免费方法汇总 - 科技大爆炸
  • 如何永久备份微信聊天记录:WeChatMsg完整本地化解决方案指南
  • Go 语言反射(Reflection)详解
  • 2026全国制造业AI企业应用十大实战服务商深度评测:为何说“人才孵化”才是AI落地的唯一命门? - 速递信息
  • 2026高精度超声波焊接机:解读行业三大核心趋势 - 速递信息
  • 2026手机照片免费转JPG教程!安卓苹果HEIC转JPG不用软件、在线无水印方法
  • 番茄小说永久保存终极指南:3步构建你的个人数字图书馆
  • Redis 常用操作笔记(Go 开发实战)
  • J-Link/J-Trace调试工具在嵌入式开发中的应用与优化
  • 思源宋体终极指南:5分钟掌握免费开源中文字体完整配置方案
  • 别再用Blender了!用Python这5个库搞定3D建模,从数据处理到打印全流程
  • MD怎么转Word?2026年保姆级教程,3步用小程序秒转
  • 全国十大猎头公司实测排行:核心能力对比解析 - 得赢
  • 长三角淘宝网店运营服务商综合能力排行盘点 - 资讯纵览
  • 苏州卫生间楼顶漏水怎么办?厨房、阳台、外墙漏水本地根治方法+靠谱维修指南 - 吉修匠
  • Winhance中文版:一站式Windows系统优化与配置管理解决方案
  • 终极指南:如何快速破解遗忘的压缩包密码
  • 2026EPS转PDF方法大全!Windows/Mac/在线工具及PS/AI转换教程
  • 别再死记命令了!图解华为交换机MAC地址那些事:老化时间、刷新ARP与端口安全详解
  • Go 语言闭包(Closure)详解