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,n】中间所有的数的解,时间段,内存使用量大。
广搜,对于n,从sqrt(n)到1遍历,计算最小的length的解。
动态规划,创建[0, n]的数组,使用i从0-n遍历,依次更新i + j*j(j的条件是: i + j*j <= n)的位置的最小值。
Code
广搜
class Solution {
public:
int numSquares(int n) {
int res = INT_MAX;
findLeast(n, 0, res);
return res;
}
void findLeast(int n, int len, int& length)
{
if (n == 0)
{
length = min(len, length);
return;
}
if (len >= length)
return;
int s = sqrt((double)n);
for (int i = s; i >= 0; i --)
findLeast(n- i*i, len+1, length);
}
};
动态规划
class Solution {
public:
int numSquares(int n) {
if (n == 1)
return 1;
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[n];
}
};
运行效率
广搜
Runtime: 728 ms, faster than 8.29% of C++ online submissions for Perfect Squares.
Memory Usage: 8 MB, less than 98.11% of C++ online submissions for Perfect Squares.
动态规划
Runtime: 128 ms, faster than 40.96% of C++ online submissions for Perfect Squares.
Memory Usage: 11.3 MB, less than 46.59% of C++ online submissions for Perfect Squares.