Given a positive integer n, find the least number of perfect square numbers (for example, 1,
4, 9, 16, ...
) which sum to n.
For example, given n = 12
, return 3
because 12
= 4 + 4 + 4
; given n = 13
, return 2
because 13
= 4 + 9
.
思路:设a*a<n<(a+1)*(a+1),则dp[n] = min{ for i= 1 to a: dp[n-i*i] } + 1;dp[n]表示数字n的平方数最小表示个数。
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1, 0);
return dfs(n, dp);
}
int dfs(int n, vector<int>& dp){
if (dp[n] != 0){
return dp[n];
}
int a = sqrt(n);
if (a*a == n){
dp[n] = 1;
return 1;
}
else{
vector<int> temp(a, 0);
for (int i = a; i>=1; i--){
temp[a-i] = dfs(n - i*i, dp) + 1;
}
dp[n] = *min_element(temp.begin(), temp.end());
return dp[n];
}
}
};
利用递归不太恰当,不利用递归速度会快很多:
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n + 1, 0);
for (int i = 1; i <= n; i++){
dp[i] = i;
for (int j = 1; j*j <=i; j++){
dp[i] = min(dp[i], dp[i - j*j] + 1);
}
}
return dp[n];
}
};