Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...
) which sum to n.
Example 1:
Input: n =12
Output: 3 Explanation:12 = 4 + 4 + 4.
Example 2:
Input: n =13
Output: 2 Explanation:13 = 4 + 9.
题目大意:
平方数被定义为1,4,9,16,25.....求解给定一个数n最少能被多少个平方数构成,输出最小个数。
解题思路:
DP,推到前几组数据可以发现,当前位置的解依赖于前面的解。
即如果本位置本身并不是一个平方数,则我们发现他的解依赖于前面0的解,为0+1。
如果本身并不是由纯粹单一的平方数(8=2^2+2^2,我们认为这是一个纯粹的平方数,他的解会依赖于4=2^2的解+1)构成,那么他的解只依赖于前一个的解+1。
所以我们初始化,当前数组全为最大值0x3f3f3f3f,dp[0]=0。
dp规则为
dp[i] = min(dp[i], dp[i-j*j]+1);
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1, 0x3f3f3f3f);
dp[0]=0;
for(int i=1;i<=n;i++){
for(int j=1;j*j<=i;j++){
dp[i] = min(dp[i], dp[i-j*j]+1);
}
}
return dp[n];
}
};