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
.
解法一:
dp算法,多一个内循环,所以通过不了runtime test。
class Solution {
public:
int numSquares(int n) {
if(n==1) return 1;
if(n==2) return 2;
vector<int> dp(n,0);
dp[0] = 1; dp[1] = 2;
for(int i = 1; i*i<=n; i++) dp[i*i-1] = 1;
for(int i= 2; i<n; i++){
int min = INT_MAX;
if(dp[i]==1) continue;
for(int j=0; j<=i/2; j++){
if(dp[j]+dp[i-j-1]<min) min = dp[j]+dp[i-j-1];
}
dp[i] = min;
}
return dp.back();
}
};
解法二:
正儿八经的递归。建立一个程度为n+1的数组,初始化为INT_MAX。可以发现,dp[i+j*j]的组合次数是dp[i] + 1。考虑到一个数字可能对应多种i+j*j的表达形式,所以还要做min()运算。
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n + 1, INT_MAX);
dp[0] = 0;
for (int i = 0; i <= n; ++i) {
for (int j = 1; i + j * j <= n; ++j) {
dp[i + j * j] = min(dp[i + j * j], dp[i] + 1);
}
}
return dp.back();
}
};