leetcode 279. 完全平方数(未解决)
279. 完全平方数
暴力解,勉强过了,时间复杂度很大
class Solution {
public:
int numSquares(int n) {
if(n <= 3) return n;
vector<int> dp(n+1,INT_MAX);//dp[i]表示 和为i的完全平方数的最少数量
dp[1] = 1;dp[2] = 2;dp[3] = 3;
for(int i = 4;i <= n;++i){
int sqrtNum = (int)sqrt(i);
if(sqrtNum * sqrtNum == i){
dp[i] = 1;continue;
}
for(int left = 1,right = i - 1;left <= right;++left,--right){
dp[i] = min(dp[i],dp[left] + dp[right]);
}
}
return dp[n];
}
};
官方题解:
class Solution {
public:
int numSquares(int n) {
// 创建一个大小为n+1的动态规划数组,dp[i]表示最少需要多少个数的平方和来表示整数i
vector<int> dp(n + 1);
// 遍历从1到n的每个整数i,计算每个i的最小平方和表示
for (int i = 1; i <= n; i++) {
// 初始化当前i的最小值为一个极大值,用于后续比较
int minn = INT_MAX;
// 遍历所有可能的平方数j*j,其中j*j <= i
for (int j = 1; j * j <= i; j++) {
// 计算i减去j*j后的数的最小平方和表示,并更新minn为更小的值
minn = min(minn, dp[i - j * j]);
}
// 当前i的最小平方和表示等于minn加1(加上的j*j这个平方数)
//具体来说,对于每个 i,我们遍历所有可能的 j,计算 i - j*j,然后查看 dp[i - j*j] 的值,这表示组成 i - j*j 所需的最少平方数的个数。
//minn 是所有这些 dp[i - j*j] 中的最小值。
//由于 j*j 本身是一个平方数,因此组成 i 所需的最少平方数的个数就是 dp[i - j*j] + 1,即在组成 i - j*j 的基础上再加上一个平方数 j*j。
dp[i] = minn + 1;
}
// 返回n的最小平方和表示
return dp[n];
}
};