LeetCode 279. 完全平方数
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
示例 1:
输入:n = 12
输出:3
解释:12 = 4 + 4 + 4
示例 2:
输入:n = 13
输出:2
解释:13 = 4 + 9
提示:
1 <= n <= 104
动态规划
class Solution:
def numSquares(self, n: int) -> int:
# dp[i] 表示和为i的完全平方数的最少数量
# dp[i] = min{dp[i - j * j] + 1} j from 1 to sqrt(i)
dp = [i for i in range(n + 1)]
for i in range(2, n + 1):
j = 1
while j <= math.sqrt(i):
dp[i] = min(dp[i], dp[i - j * j] + 1)
j += 1
return dp[n]
时间复杂度: O ( n n ) O(n\sqrt{n}) O(nn)。第一层循环为n,第二层循环为 n \sqrt{n} n,但并不是每次外层循环第二层循环都是 n \sqrt{n} n,若第一层为第i次循环,第二层循环次数为 i \sqrt{i} i。这时可以基于二维图像快速分析时间复杂度:
双层循环基于二维图像和夹逼定理思想快速分析渐进复杂度
首先,对于如下程序
for i in range(n):
for i in range(n):
...
毫无疑问,第一层循环必定循环n次,而第二层循环当在每次的第一层循环时都会循环n次,则时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。
已第一层循环次数为x轴,第二层循环次数为y轴,易得:
假定横纵坐标最大值为n
显然围成的矩形面积n*n就是渐进意义上的时间复杂度
同理,分析下面程序
for i in range(n):
for i in range(n//2):
...
图中三角形面积n*n/2即为时间复杂度
对于上述动态规划解法,第一层循环为n,第二层循环次数为第一层循环次数i的 i \sqrt{i} i,说白了就是外层循环作为x,二层循环作为y,有 y = x y=\sqrt{x} y=x关系,求x=n时该图像与x轴和x=n围成的面积。
本质上时间复杂度为 1 + 2 + 3 + 4 + . . . + n ) 1+\sqrt2+\sqrt3+\sqrt4+...+\sqrt{n}) 1+2+3+4+...+n),心算不好算,而且有时候笔算也不一定会推导,所以基于函数图像和夹逼定理思想会较为容易
显然
y
=
x
y=\sqrt{x}
y=x与
x
=
n
x=n
x=n和
y
=
0
y=0
y=0围成的面积一定小于
n
n
n\sqrt{n}
nn,即图中虚线矩形面积。
此时需要取x的一个特殊值
x
0
x_0
x0帮我我们使用夹逼定理思想,假设
x
0
x_0
x0取
n
2
\frac{n}{2}
2n,则
y
0
=
n
2
y_0=\sqrt{\frac{n}{2}}
y0=2n,由于该函数递增,不妨x取
[
n
2
,
n
]
[\frac{n}{2},n]
[2n,n]段,让y恒等于
n
2
\sqrt{\frac{n}{2}}
2n,就是图中实线矩形,则一定有:
实矩形面积 <
x
\sqrt{x}
x围成的面积<虚线矩形面积
加上等号也成立
实矩形面积 <=
x
\sqrt{x}
x围成的面积<=虚线矩形面积
假设围成的面积为f(n),则时间复杂度T就是O(f(n))
则
(
n
−
n
2
)
n
2
≤
f
(
n
)
≤
n
n
(n-\frac{n}{2})\sqrt{\frac{n}{2}}\leq{f(n)}\leq{n}\sqrt{n}
(n−2n)2n≤f(n)≤nn
n n 2 2 ≤ f ( n ) ≤ n n \frac{n\sqrt{n}}{2\sqrt2}\leq{f(n)}\leq{n}\sqrt{n} 22nn≤f(n)≤nn
取渐进大O
O
(
n
n
2
2
)
≤
O
(
f
(
n
)
)
≤
O
(
n
n
)
{O(\frac{n\sqrt{n}}{2\sqrt2})}\leq{O(f(n))}\leq{O({n}\sqrt{n})}
O(22nn)≤O(f(n))≤O(nn)
O
(
n
n
)
≤
O
(
f
(
n
)
)
≤
O
(
n
n
)
{O({n}\sqrt{n})}\leq{O(f(n))}\leq{O({n}\sqrt{n})}
O(nn)≤O(f(n))≤O(nn)
显然 T = O ( n n ) T=O({n}\sqrt{n}) T=O(nn)
总结一下,整体上就是根据二维图像找面积,上界通常容易找,但是下界需要找一个 x 0 x_0 x0,通常 x 0 x_0 x0一定含n,具体问题具体分析,本题中n取 n 2 \frac{n}{2} 2n还是取 n 3 \frac{n}{3} 3n,亦或 n 4 \frac{n}{4} 4n都不影响分析,重要的是能使用夹逼定理思想就行。
空间复杂度: O ( n ) O(n) O(n)。n+1的空间存储状态。