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++代码
|
|