首页/新闻资讯/正文详情

动态规划与数学优化解LeetCode完全平方数问题

发布时间:2026/11/2 16:53:37 来源:云帆数科 栏目:资讯中心
动态规划与数学优化解LeetCode完全平方数问题
1. 问题理解与解法概述LeetCode 279题完全平方数是一个经典的动态规划问题题目要求我们找到组成给定整数n所需的最少数量的完全平方数。完全平方数指的是1, 4, 9, 16...这类可以表示为某个整数平方的数字。这个问题看似简单但蕴含着深刻的数学原理。在实际操作中我发现很多初学者容易陷入暴力穷举的误区导致算法效率极低。经过多次实践我总结出了一套高效的解决方案下面将详细分享我的解题思路和优化技巧。2. 动态规划解法详解2.1 基本思路动态规划是解决这个问题的首选方法。核心思想是对于目标数n它最少需要的完全平方数数量等于n减去某个完全平方数后的数的最优解加1。具体来说我们可以建立一个dp数组其中dp[i]表示组成数字i所需的最少完全平方数数量。初始条件是dp[0] 0因为0不需要任何完全平方数组成。2.2 实现步骤初始化dp数组长度为n1所有元素设为无穷大dp[0] 0遍历从1到n的所有数字对于每个数字i遍历所有小于等于i的完全平方数j*j更新dp[i] min(dp[i], dp[i - j*j] 1)最终返回dp[n]def numSquares(n): dp [float(inf)] * (n 1) dp[0] 0 for i in range(1, n 1): j 1 while j * j i: dp[i] min(dp[i], dp[i - j * j] 1) j 1 return dp[n]2.3 复杂度分析时间复杂度O(n√n)因为外层循环n次内层循环最多√n次 空间复杂度O(n)需要存储dp数组3. 数学优化解法3.1 四平方和定理根据拉格朗日四平方和定理任何自然数都可以表示为不超过4个完全平方数的和。这意味着答案只可能是1、2、3或4。基于这个定理我们可以设计更高效的算法检查n是否是完全平方数如果是返回1检查n是否可以表示为两个完全平方数的和检查n是否满足4^k*(8m7)的形式如果是返回4其他情况返回33.2 实现代码def numSquares(n): def is_square(x): s int(math.sqrt(x)) return s * s x # 情况1n是完全平方数 if is_square(n): return 1 # 情况2检查是否可以表示为两个平方数之和 for i in range(1, int(math.sqrt(n)) 1): if is_square(n - i * i): return 2 # 情况3检查是否满足4^k*(8m7) temp n while temp % 4 0: temp // 4 if temp % 8 7: return 4 # 情况4其他情况返回3 return 33.3 复杂度分析时间复杂度O(√n)大大优于动态规划解法 空间复杂度O(1)只需要常数空间4. BFS解法探索4.1 广度优先搜索思路我们可以将这个问题转化为图论中的最短路径问题。把每个数字看作节点如果两个数字相差一个完全平方数就建立一条边。这样问题就转化为从n到0的最短路径。4.2 实现代码from collections import deque def numSquares(n): squares [i*i for i in range(1, int(n**0.5)1)] queue deque([(n, 0)]) visited set() while queue: num, step queue.popleft() for square in squares: if num - square 0: return step 1 if num - square 0 and (num - square) not in visited: visited.add(num - square) queue.append((num - square, step 1)) return -14.3 复杂度分析时间复杂度O(n^(h/2))其中h是最短路径长度 空间复杂度O(n)用于存储队列和访问集合5. 性能对比与选择建议5.1 三种方法对比方法时间复杂度空间复杂度适用场景动态规划O(n√n)O(n)通用解法易于理解数学方法O(√n)O(1)大数情况最优BFSO(n^(h/2))O(n)中等规模数据5.2 选择建议对于面试场景推荐先展示动态规划解法再优化到数学解法对于竞赛场景直接使用数学解法最优对于学习目的建议实现所有三种方法以深入理解6. 常见问题与调试技巧6.1 边界条件处理n0时应该返回0n1时应该返回1大数情况注意整数溢出问题Python不需要担心6.2 优化技巧预先生成完全平方数列表避免重复计算在动态规划中内层循环可以从大到小遍历可能提前终止使用记忆化搜索替代纯动态规划减少不必要的计算6.3 调试建议打印中间dp数组验证状态转移是否正确对于数学解法单独测试四种情况的判断逻辑使用小规模数据手动计算预期结果验证代码正确性7. 实际应用与扩展7.1 实际应用场景密码学中的数字分解图像处理中的像素压缩金融领域的资产组合优化7.2 问题变种限制使用的完全平方数范围求所有可能的组合而不仅是最少数量引入权重后的最优解问题7.3 进阶学习建议学习更多数论知识如费马平方和定理研究背包问题的其他变种探索动态规划的状态压缩技巧经过多次实践验证我发现数学解法在性能上具有绝对优势特别适合处理大数情况。而在面试场景中从动态规划入手逐步优化到数学解法的展示方式往往能更好地展示解题思路和算法能力。

相关推荐

Agent运行机制拆解:上下文、检查点、任务恢复与资源管控
Agent运行机制拆解:上下文、检查点、任务恢复与资源管控

1. 从一次线上事故说起:Agent 为什么需要“运行机制”凌晨两点,监控告警响了。一个跑了四十多分钟的 Agent 任务在调用某个外部接口时超时,进程直接挂掉。重启之后,它从第一步重新开始,把前面已经完成的十几个工具调用… · 2026/11/2 16:53:37

哈利波特同人项目开发与版本控制实践
哈利波特同人项目开发与版本控制实践

1. 项目背景与核心价值"harrypotter16-1"这个看似简单的项目命名背后,实际上蕴含着丰富的创意可能性。作为一个资深内容创作者,我第一眼看到这个标题时,脑海中立即浮现出几个关键方向:这可能是某个粉丝创作项目、同人作… · 2026/11/2 16:53:37

Python构建AI产品计费系统:Token成本模型与Stripe支付集成
Python构建AI产品计费系统:Token成本模型与Stripe支付集成

1. 为什么“能跑通的 AI 产品”和“能赚钱的 AI 产品”是两回事我见过太多团队,模型调得飞起,Demo 演示惊艳全场,上线三个月后一算账,每服务一个用户净亏两毛。问题从来不在模型本身,而在于从第一天起就没把成本模型和… · 2026/11/2 16:53:37

MySQL插入语句修改数据:ON DUPLICATE KEY UPDATE与REPLACE INTO详解
MySQL插入语句修改数据:ON DUPLICATE KEY UPDATE与REPLACE INTO详解

1. 先搞清楚一件事:插入语句到底能不能改数据很多人第一次看到"用插入语句修改字段值"这个说法,第一反应是"这不是矛盾吗"。插入是往表里加新行,修改是动已有的行,两个动作在语义上是对立的。但如果你真的在业… · 2026/11/3 4:26:48

LLM硬件加速器:KV Cache与MoE架构的专用硬件解法
LLM硬件加速器:KV Cache与MoE架构的专用硬件解法

1. 这不是“又一个AI芯片”:LLM硬件加速器的本质是重构计算范式你可能已经看过太多标题里带“AI芯片”“大模型加速”“国产替代”的新闻稿——它们往往堆砌参数、罗列算力数字、强调“支持千亿参数”,最后落点在“已量产”“达成战略合作”。但真正做过… · 2026/11/3 4:26:48

OpenCode+Harness智能体工程方法论:构建可编排、可审计的生产级智能体
OpenCode+Harness智能体工程方法论:构建可编排、可审计的生产级智能体

1. 这不是又一个“AI玩具”,而是一套可落地的智能体工程方法论OpenCode 智能体教程——光看标题,很多人第一反应是“又一个新出的AI平台宣传页”。但如果你真花30分钟拆开它背后的Harness核心架构,就会发现这根本不是教你怎么点几下鼠标调用大… · 2026/11/3 4:26:48

人形机器人技术瓶颈与商业化路径分析
人形机器人技术瓶颈与商业化路径分析

1. 人形机器人产业现状与商业困境人形机器人这个领域最近两年突然火了起来,但真正了解行业的人都知道,现阶段做这个生意简直就是在"烧钱"。我接触过几家头部企业,他们每年的研发投入都是以亿为单位计算的,但商业化落地却… · 2026/11/3 4:26:48

边缘容器服务:云边协同架构的技术突破与实践
边缘容器服务:云边协同架构的技术突破与实践

1. 边缘容器服务的技术本质与行业痛点云原生技术发展到今天,已经形成了从开发到运维的完整技术栈,但传统中心化云计算架构在物联网、工业互联网等场景下暴露出明显短板。我曾参与过某智能制造项目的云边协同改造,当车间设备产生的实时数据需要… · 2026/11/3 4:26:48

TFLite内存规划器解析:张量生命周期与Arena复用机制
TFLite内存规划器解析:张量生命周期与Arena复用机制

做端侧推理的人,早晚会在内存上栽一回。模型文件 20MB,你觉得稳了,结果一跑起来进程直接飙到 200MB 以上,换个小内存的设备就 OOM。多数人第一反应是换更小的模型、降分辨率,其实还有一个比模型体积更隐蔽的“内存黑洞… · 2026/11/3 4:25:48

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码