思路: 跟leetcode 343 分割整数最大积 的思路一样,利用动态规划,存储每个 i 值完全平方数 的最小个数,
然后再利用双重循环, dp[a] = Math.min(dp[a], dp[a - b*b] + 1); 这样去寻找最小个数,为啥是b*b,因这样就等于 dp[i - b*b]的最小个数 + 1即可,这样可以节省时间
class Solution {
public int numSquares(int n) {
int []dp = new int [n + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
for(int i =1; i * i < n + 1; i ++)
{
dp[i * i] = 1;
}
for(int a = 1; a < n + 1; a ++)
{
for(int b = 1; b*b < a; b ++)
{
dp[a] = Math.min(dp[a], dp[a - b*b] + 1);
}
}
return dp[n];
}
}