问题描述
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
.
思路分析
给一个正数n,计算它需要由多少个完全平方数加和而成。
使用动态规划来做,每一个数需要的最小完全平方数,就是它剪去一个完全平方数之后的最少数再加一。所以将每个数所需要的完全平方数存在vector中,然后每次计算一个数所需的完全平方数。
代码
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1, INT_MAX);
dp[0] = 0;
for (int i = 1; i <= n; i++){
int minnum = INT_MAX;
int j = 1;
while(i - j * j >= 0){
minnum = min(dp[i - j * j] + 1, minnum);
j++;
}
dp[i] = minnum;
}
return dp[n];
}
};
时间复杂度:
O(n)
空间复杂度:
O(n)
反思
想直接用贪心做,反而效果不好,例如对于n = 12。贪心的结果是9,1,1,1。但实际最好的是4,4,4。