给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1:
输入: n =12输出: 3 解释:12 = 4 + 4 + 4.
示例 2:
输入: n =13输出: 2 解释:13 = 4 + 9.
=====================================================================
解题思路,动态规划..
dp[n]用来记录n最小可以有几个平方数组成
状态转移方程 : dp[n] = min(dp[n-j*j]+1,dp[n])
遍历从1到j(j*j<n),可以得到dp[n]中最小的解,更新dp[n]的值
时间复杂度O(n^2)
贴一下代码
class Solution {
public int numSquares(int n) {
int[] dp = new int[n+1];
dp[0] = 0;
for(int i=0;i<n+1;i++)
dp[i]=i;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j*j<= i; ++j) {
dp[i]=Math.min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
}
================================================================
由拉格朗日四平方和定理....
任何一个正整数都可以由4个完全平方数组成
我们只需要处理这4个情况
n%8==7满足这样条件的数,只能由4个组成
如果能被开方,返回1,
遍历 1到 x (x^2<n)
如果n-x可以被开方,就返回2
剩余的返回3
这样的话是O(logn),S(1)
贴一下代码,不是我写的..
class Solution {
public int numSquares(int n) {
while (n % 4 == 0)
n /= 4;
if (n % 8 == 7)
return 4;
for (int a = 0; a * a <= n; ++a) {
int b = (int) Math.sqrt(n - a * a);
if (a * a + b * b == n) {
if (a == 0 || b == 0) {
return 1;
}
return 2;
}
}
return 3;
}
}
554

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



