思路:
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];
}
}
本文介绍了一种利用动态规划(DP)方法解决最小平方数问题的算法实现。通过构建状态转移方程,逐步求解从1到n所需的最少平方数。详细解释了算法的实现过程,包括初始化、状态转移和最终返回结果。代码示例提供了完整的Java实现,展示了如何将理论转化为实际编程应用。
525

被折叠的 条评论
为什么被折叠?



