题目描述:
给你一个整数 n
,返回 和为 n
的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1
、4
、9
和 16
都是完全平方数,而 3
和 11
不是。
示例 1:
输入:n =12
输出:3 解释:12 = 4 + 4 + 4
示例 2:
输入:n =13
输出:2 解释:13 = 4 + 9
提示:
1 <= n <= 104
思路分析:
我们考虑到每一个数的完全平方数的最少数量都依赖于前面已经求好的比该数小的值的两数之和,该数的完全平方数的最少数量为所有两数的完全平方数的最少数量之和的最小值。因此,我们考虑使用动态规划思路来解决该题,设置一个dp数组,其长度为n+1,dp数组中的第i个数表示当整数为i时,此时和为 i的完全平方数的最少数量。
动态转移方程:
dp[1]=1;
dp[i]=1; ...if(i是完全平方数)
dp[i]=min(dp[j]+dp[i-j]) ...j=1,2,...i-1 if(i不是完全平方数)
代码:
class Solution {
public int numSquares(int n) {
if(isSquare(n)){
return 1;
}
int[] count=new int[n+1];
for(int i=1;i<=n;i++){
if(isSquare(i)){
count[i]=1;
}else{
int index=1;
count[i]=count[1]+count[i-1];
while(index<i){
if(count[index]+count[i-index]<count[i]){
count[i]=count[index]+count[i-index];
}
index++;
}
}
}
return count[n];
}
public boolean isSquare(int n){
for(int i=1;i<=n;i++){
if(i*i==n){
return true;
}
}
return false;
}
}