思路:
DP。
设 dp[i]
表示当 n
等于 i
时需要的最少的平方个数,i可以表示成 a + b * b,那么就可以建立递推方程:
dp[a + b * b] = min(dp[a] + 1, dp[a + b * b]);
时间复杂度O(N^2) ,空间复杂度 O(N)。
java code:
public class Solution {
public int numSquares(int n) {
int[] dp = new int[n + 1];
//init dp
Arrays.fill(dp, Integer.MAX_VALUE);
for(int i = 0; i * i <= n; ++i) {
dp[i * i] = 1;
}
//construct dp
for(int a = 0; a <= n; ++a) {
for(int b = 0; a + b * b <= n; ++b) {
dp[a + b * b] = Math.min(dp[a] + 1, dp[a + b * b]);
}
}
return dp[n];
}
}