首先给出一个超时的方法,这种方法和下面改良过的方法逻辑上完全一致,但是可以看到内层循环逻辑中有许多操作是多余的,也就是内层循环中的j其实没有必要一直到n在结束,实际上是可以将if判断的条件直接放到内层循环的逻辑里面,这样的话可以实际的减少总体循环次数,从而避免超时。
class Solution {
public:
int numSquares(int n) {
vector<int>dp(n+1);
for(int i=1;i<=n;i++)
{
dp[i]=i;
for(int j=1;j<=n;j++)
{
if(i-j*j>=0)
dp[i]=min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
};
下面给出改进过的版本。
class Solution {
public:
int numSquares(int n) {
vector<int>dp(n+1);
for(int i=1;i<=n;i++)
{
dp[i]=i;
for(int j=1;i-j*j>=0;j++)
{
dp[i]=min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
};