给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...
)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1:
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4.
示例 2:输入: n = 13
输出: 2
解释: 13 = 4 + 9.
解题思路: 使用动态规划来解决,状态转移方程为 numSquares(n) = min(numSquares(n-k)+1),其中k是任意的一个完全平方数。
使用一个dp数组来记录一些中间值,减少运算时间,首先根据输入的n来计算出其对应的所有完全平方数数组,再依次遍历寻找最小的值。
class Solution {
public int numSquares(int n) {
int[] dp = new int[n+1];
Arrays.fill(dp,Integer.MAX_VALUE);
int maxSquare = (int)Math.sqrt(n)+1;
int[] square = new int[maxSquare];
dp[0] = 0;
for(int i=1;i<maxSquare;i++){
square[i] = i*i;
}
for(int i = 1;i<=n;i++){
for(int s=1;s<maxSquare;s++){
if(i<square[s]){
break;
}
dp[i] = Math.min(dp[i],dp[i-square[s]]+1);
}
}
return dp[n];
}
}