279. 完全平方数
class Solution {
public:
int numSquares(int n) {
int t = 1;
vector<int> nums;
//遍历所有得完全平方数
//nums到最后就是我们得数字集合
while(t*t<=n){
nums.push_back(t*t);
t++;
}
//明确,是刚好凑成的最小值,而且不是累计的
vector<vector<int>> dp(nums.size()+1, vector<int>(n+1, INT_MAX));
//花费零个数凑出数值0
dp[0][0] = 0;
for(int i = 1; i <= nums.size(); i++){
for(int j = 0; j <= n; j++){
for(int k = 0; k * nums[i-1]<=j; k++){
if(dp[i-1][j-k*nums[i-1]] != INT_MAX) dp[i][j] = min(dp[i][j], dp[i-1][j-k*nums[i-1]]+k);
}
}
}
return dp[nums.size()][n];
}
};
然后从三重循环优化到二重循环
class Solution {
public:
int numSquares(int n) {
int t = 1;
vector<int> nums;
//遍历所有得完全平方数
//nums到最后就是我们得数字集合
while(t*t<=n){
nums.push_back(t*t);
t++;
}
//明确,是刚好凑成的最小值,而且不是累计的
vector<vector<int>> dp(nums.size()+1, vector<int>(n+1, n+1));
//花费零个数凑出数值0
dp[0][0] = 0;
for(int i = 1; i <= nums.size(); i++){
for(int j = 0; j <= n; j++){
if(j >= nums[i-1]) dp[i][j] = min(dp[i-1][j], dp[i][j-nums[i-1]]+1);
else dp[i][j] = dp[i-1][j];
}
}
return dp[nums.size()][n];
}
};
从二重循环优化到一重循环
class Solution {
public:
int numSquares(int n) {
int t = 1;
vector<int> nums;
//遍历所有得完全平方数
//nums到最后就是我们得数字集合
while(t*t<=n){
nums.push_back(t*t);
t++;
}
vector<int> dp(n+1, n+1);
dp[0] = 0;
for(int i = 1; i <= nums.size(); i++){
for(int j = 0; j <= n; j++){
if(j >= nums[i-1]) dp[j] = min(dp[j], dp[j-nums[i-1]]+1);
}
}
return dp[n];
}
};