题目链接:力扣
很显然的动态规划的思路:假设和为n的完全平方数的最少数量为p[n],则对于每个n,都会有
p[n]=1+min(p[n-i*i]),其中i*i<=n
即对于所有i*i<=n的i,在n-i*i的基础上再加一个完全平方数i*i就可以得到n,因此p[n]=p[n-i*i]+1,于是我们的目标就是找到最小的p[n-i*i]。代码如下:
class Solution {
public:
int p[10010]; //存和为k的完全平方数的最小数量(1<=k<=n)
int numSquares(int n) {
p[1]=1;
for(int i=2;i<=n;i++){ //O(n)
int m=p[i-1];
for(int j=2;j<=i/j;j++){ //O(sqrt(n))
if(p[i-j*j]<m) m=p[i-j*j];
}
p[i]=m+1;
}
return p[n];
}
};
时间复杂度: O(n),从1遍历到n-->O(n),对1-n中的每一个i向后遍历所有j*j-->O(
)
空间复杂度: O(n)