279. 完全平方数
分析
- 定义状态:
f[i]
:表示和为i
的完全平方数的最少数量
- 状态转移方程:
- 对于
i
,尝试减去一个完全平方数j^2
,转移状态为:f[i] = min(f[i], f[i - j^2] + 1)
- 对于
- 初始化:
f[0] = 0
:和为0
的最少数量为0
- 其他状态
f[i]
初始化为4
,因为根据四平方和定理,一个数至多由4
个完全平方数组成
- 遍历顺序:
- 外层循环遍历
i
(目标和),内层循环遍历j
(尝试的完全平方数)
- 外层循环遍历
- 结果:
- 返回
f[n]
即为和为n
的完全平方数的最少数量
- 返回
时间复杂度
- 外层循环遍历
i
从1
到n
,内层循环枚举完全平方数的数量,最多为\sqrt{n}
总复杂度为 O(n*\sqrt{n})
空间复杂度
使用排序 O(logn)
的额外空间,其余操作在原地完成,空间复杂度为 O(1)
使用了长度为 n + 1
的数组 f
,空间复杂度为 O(n)
C++代码
|
|