题目描述
思路解析动画文字版
记住这条:答案 = n 的所有质因子相加。下面用 n=60 一步步试除,把 60 拆成 2 x 2 x 3 x 5。
开局:要分解 60。从最小质数 d=2 开始试除,能整除就把 d 收进答案。
轮到 d=2(紫色)。先看 2×2=4 是否 ≤ 剩余 n=60,成立才继续试除;若 d×d 已大于剩余 n,说明没有更小因子可拆,循环退出,再把剩余 n(若 > 1)作为最后一个质因子补加。
60 能被 2 整除。说明这一段要把长度扩大 2 倍,花 2 步。把 2 收进答案。
收下质因子 2(绿色):ans 加 2 变成 2,剩余 n 缩成 30。继续看 30 还能不能再被 2 整除。
30 能被 2 整除。说明这一段要把长度扩大 2 倍,花 2 步。把 2 收进答案。
收下质因子 2(绿色):ans 加 2 变成 4,剩余 n 缩成 15。继续看 15 还能不能再被 2 整除。
15 不再被 2 整除,d=2 这一段拆完了。d 加 1,看下一个候选。
轮到 d=3(紫色)。先看 3×3=9 是否 ≤ 剩余 n=15,成立才继续试除;若 d×d 已大于剩余 n,说明没有更小因子可拆,循环退出,再把剩余 n(若 > 1)作为最后一个质因子补加。
15 能被 3 整除。说明这一段要把长度扩大 3 倍,花 3 步。把 3 收进答案。
收下质因子 3(绿色):ans 加 3 变成 7,剩余 n 缩成 5。继续看 5 还能不能再被 3 整除。
5 不再被 3 整除,d=3 这一段拆完了。d 加 1,看下一个候选。
试除循环结束后还剩 n=5,且 5 > 1,说明它是一个大质因子(再没有更小因子能拆它),直接收进答案。
加上最后这个质因子 5,ans = 12,剩余 n 归 1。60 = 2 × 2 × 3 × 5,质因子之和 = 12,就是最少操作次数。
边界:n=1 答 0;质数 n 答 n 本身(无法再拆)。
两个高频追问:一是证明拆质因子最优,二是 DP 写法与复杂度对比。
参考代码
class Solution: def minSteps(self, n: int) -> int: ans = 0 d = 2 while d * d <= n: while n % d == 0: ans += d n //= d d += 1 return ans + (n if n > 1 else 0)复杂度
- 时间:O(√n),d 只需试到 √n,最多 √n 次
- 空间:O(1),只用 ans、d、n 几个变量
易错点
面试追问把动画讲成自己的话
追问为什么质因数分解一定最优,而不是别的拆法?
追问也能用动态规划做吗?复杂度如何?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
最长递增子序列的个数
LeetCode 673 · 中等 · 沿着 动态规划套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题