完全平方数
题目
完全平方数
给你一个整数n,返回和为n的完全平方数的最少数量 。完全平方数是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
示例
![]() |
|---|
解题思路
1.根据题目我们需要找到完全平方数,使其sum = n;
2.根据题意我们可以知道完全平方数为0-m;其中 m = sqrt(n);
3.当值大于m时,其平方和大于n,故不满足题意。
4.如此便将题目转换为11,22, 33, 44, ..., m*m。使其和值为n。
5.根据题目,找到完全平方数最少数量。
6.于是当前状态方程就变成了dp[k] = min(dp[k], dp[k-nums[i]]+1);
代码
class Solution {
public:
int numSquares(int n) {
int num = sqrt(n);
vector<int> dp(n+1, INT_MAX);
for(int i = 0; i <= num; i++){
int temp = i * i;
for(int k = temp; k <= n; k++){
//这里具有堆栈溢出风险。
if(k == temp){
dp[k] = 1;
}
if(dp[k]!= INT_MAX || dp[k-temp] != INT_MAX){
dp[k] = min(dp[k], dp[k-temp]+1);
}
}
}
return dp[n];
}
};
class Solution {
public:
int numSquares(int n) {
int num = sqrt(n);
vector<int> dp(n+1, INT_MAX);
dp[0] = 0;
for(int k = 0; k <= n; k++){
for(int i = 1; i * i <= k; i++){
dp[k] = min(dp[k], dp[k-i*i]+1);
}
}
return dp[n];
}
};


浙公网安备 33010602011771号