当前位置: 首页 > 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.zskr.cn/news/1436860.html

相关文章:

  • 2026西安正规老酒水回收陈年茅台品鉴馆同城极速上门服务高价回收 - 速递信息
  • Arduino电子骰子:从随机数生成到嵌入式系统全流程实践
  • AcWing 2174:[模板] 费用流 ← Dinic / EK + SPFA
  • 五分钟入门强化学习PPO(Proximal Policy Optimization)
  • 2026全国制造业AI企业应用十大实战服务商深度评测:为何说“人才孵化”才是AI落地的唯一命门? - 速递信息
  • ESP32显示驱动终极指南:打造高效嵌入式图形界面
  • 2026年全国制造业AI应用实战服务商优选榜单与采购推荐指南 - 速递信息
  • Go 语言匿名函数详解
  • 不止于收发:挖掘ZCANPRO的UDS诊断与自动化测试潜力,提升车载测试效率
  • 从PBMC数据实战出发:手把手教你用Scanpy完成单细胞测序标准分析流程(附代码避坑点)
  • Python测试模式:构建高效测试体系
  • 2026 AI企业应用培训优选指南(财务/人力/生产/营销型) - 速递信息
  • 别再手画UML了!用StartUML 6.0给C++项目画类图,保姆级避坑指南
  • 2026南京漏水维修攻略,卫生间、阳台、外墙、屋顶、地下室漏水,靠谱防水门店推荐 - 吉修匠
  • 遂宁黄金回收商家推荐榜单5.31今日大盘价 + 靠谱门店实测,价高无套路 - 速递信息
  • 为什么97%的非洲开发者还没用上Gemini多语能力?——3步完成阿姆哈拉语API集成(附调试秘钥)
  • 杭州黄金回收|2026 今日金价 + 正规门店 + 无套路变现 - 速递信息
  • CE修改器找基址保姆级教程:从动态地址到绿色指针,手把手教你定位稳定内存(附汇编指令分析)
  • 全国淘宝网店运营服务商 核心能力实测盘点 - 速递信息
  • 有没有老哥哥说下前端真实的现状
  • 单向循环链表超详细精讲 | 带头节点带头指针 + 完整可运行c语言代码 - Fa-Mian
  • 手机号码定位终极方案:5分钟构建免费高效的归属地查询系统
  • 青岛黄金回收怎么选?5.31金价 + 靠谱门店全攻略 - 速递信息
  • 3步完成《艾尔登法环》角色迁移:告别存档损坏的终极方案
  • 合肥高科经济技工学校招生办公室电话号码是多少?——官网最新发布! - 教育为先
  • 新疆伊犁六日游旅行社盘点 聚焦纯玩品质线路 - 互联网科技品牌测评
  • 20252919 2025-2026-2 《网络攻防实践》第十次作业
  • 软件设计师学习记录
  • RAG落地不踩坑!Embedding模型选型最全攻略,新手直接抄作业
  • 现在不重构增长链路,Q3将错失最后窗口期:Gemini 2024下半年用户增长生死线(含合规红线清单)