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

千问 LeetCode 2338.统计理想数组的数目 public int idealArrays(int n, int maxValue)

这道题是 LeetCode 2338 题,是一道非常经典的组合数学 + 质因数分解问题。如果直接使用动态规划(DP)暴力求解,会因时间复杂度过高而超时。我们需要透过“整除”这个条件,挖掘其背后的数学规律。

题目解析
理想数组需要满足:
1. 数组中的每个数都在 [1, maxValue] 范围内。
2. 每个 arr[i] 都能被 arr[i-1] 整除(即 arr[i] % arr[i-1] == 0)。

由条件2可知,数组一定是非递减的。我们可以换个角度思考:枚举理想数组的最后一个数(最大值)。

假设理想数组的最后一个数是 x。
1. 分解质因数:将 x 分解质因数,假设 x = p1^k1 * p2^k2 * ...。
2. 分配质因数:数组从第一个数(最小为1)演变到最后一个数 x,本质上就是把 x 的所有质因数,一步步“分配”到数组的 n 个位置上。由于数组是非递减的,质因数只能“增加”不能“减少”。
对于某一个质因数 p,假设它在 x 中出现了 k 次(即 p^k),我们需要把这 k 个 p 分配到 n 个位置上。这就变成了一个经典的隔板法问题:把 k 个相同的小球放入 n 个不同的盒子中,允许盒子为空,有多少种放法?
公式为:C(n + k - 1, k)。
3. 计算总数:对于数 x,它的总方案数就是它所有质因数的分配方案数的乘积。最后,我们将 1 到 maxValue 所有数字作为结尾的方案数累加,就是最终答案。

为什么不会超时?
因为 maxValue 最大为 10^4,而 2^14 > 10^4,所以任何一个数的质因数总个数最多只有 13 个左右。这使得组合数的计算非常快。

Java 代码实现

class Solution {
private static final int MOD = 1000000007;
// 10^4 以内的数,质因数个数最多不超过 14 个 (2^14 > 10000)
private static final int MAX_K = 14;

public int idealArrays(int n, int maxValue) {
// 1. 预处理组合数 C(i, j),使用杨辉三角递推公式:C(i, j) = C(i-1, j) + C(i-1, j-1)
// 我们需要计算 C(n + k - 1, k),i 最大约为 n + 14
long[][] c = new long[n + MAX_K + 1][MAX_K + 1];
for (int i = 0; i 1,说明还有一个大于 sqrt(x) 的质因数,个数为 1
if (temp > 1) {
ways = (ways * c[n][1]) % MOD;
}
ans = (ans + ways) % MOD;
}
return (int) ans;
}
}

复杂度分析
* 时间复杂度:O(maxValue * sqrt(maxValue) + n * MAX_K)。预处理组合数为 O(n),枚举每个数并分解质因数最坏是 O(sqrt(maxValue))。由于 MAX_K 极小,整体运行效率非常高。
* 空间复杂度:O(n * MAX_K),主要用于存储预处理的组合数表。

这种解法完美避开了暴力 DP 的超时陷阱,利用数学性质将问题转化为了高效的组合数计算。如果有任何步骤不理解,随时可以问我!

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

相关文章:

  • 2026年许昌农村建房服务机构实力排行一览:郏县农村建别墅、郏县农村建房、郏县农村自建房施工、郏县农村自建房设计选择指南 - 优质品牌商家
  • PCAN脚本编程:从宏录制到自动化测试的进阶之路
  • 物联网产品开发实战:从概念到量产的全栈路径与低功耗设计
  • 终极指南:5分钟快速免费解锁Cursor Pro全部功能的完整解决方案
  • 基于Spring Boot+Vue+MySQL的特色旅游资源分享系统 毕设成品 【含源码 + 数据库】
  • Cesium图层深度控制:zIndex实战解析与常见误区
  • 青海网吧2026年TOP10技术维度评测及联系指南:青海网咖、青海网吧、青海电竞馆、青海电竞选择指南 - 优质品牌商家
  • livekit全双工语音交互系统
  • 对比直连与通过Taotoken调用大模型API的延迟与稳定性体感差异
  • 新闻发稿公司TOP测评:2026年七大主流渠道深度解析,传声港以98 - 博客湾
  • 分享2026黑客最常用的10款黑客工具,收藏这一篇就够了!
  • 华为官方霸屏强推的背单词神器《干词》鸿蒙系统!
  • PCB真空出气(Outgassing)测试:ASTM E595与ASTM E1559微污染管控中的应用
  • Java 实现微信红包分配算法
  • 软文推广平台推荐:2026年TOP8主流渠道深度测评 - 博客湾
  • Taotoken支持的标准OpenAI协议如何降低开发者接入与迁移成本
  • TVA系统的三层协同低延迟部署秘诀
  • 别再手动换词了!实测5款论文降AI工具,这款“结构级”神器一次降至25%以下
  • Live-SWE-agent:首个实时自演化的AI软件工程师智能体
  • DevOps流程卡点频发?DeepSeek 2024最新优化框架已上线,93%团队3天内完成首轮改造
  • 优化算法怎么选?从PSO到GWO:5个实际工程问题对比测试报告
  • 2026年5月衡水水利工程选型指南:河北格宾五金丝网有限公司实力解析 - 2026年企业推荐榜
  • PyQt6高性能GUI应用架构设计与信号槽机制深度解析
  • 从Solyndra事件看美国太阳能产业转型与能源创新体系构建
  • 激光带宽对OPC模型精度的影响与优化策略
  • Neovim集成GPT:neoai.nvim插件深度配置与AI编程实战
  • ISP运营商(Internet Service Provider 互联网服务提供商)介绍(提供DNS服务器)骨干网络、Peering对等互联、MPLS、带宽、延迟、丢包、抖动、SD-WAN
  • 构建飞书双向集成中继器:Node.js实现企业内外系统自动化连接
  • 计算机专业不想“敲代码”,都来冲这个行业
  • DeepSeek LeetCode 2338.统计理想数组的数目 JavaScript实现