问题描述:
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1:
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4.
示例 2:
输入: n = 13
输出: 2
解释: 13 = 4 + 9.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/perfect-squares
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
执行结果:
代码描述:
根据一个定理(我还不明白怎么回事的定理)——四平方和定理:
Lagrange 四平方定理: 任何一个正整数都可以表示成不超过四个整数的平方之和。
if and only if n is not of the form n = 4^a * (8b + 7) for integers a and b.
满足四数平方和定理的数n(这里要满足由四个数构成,小于四个不行),必定满足 n = 4^a(8b + 7)
那么我们这个问题的解法就变得很简单了,我们的结果只有1,2,3,4
,四种可能。
首先将输入的n
迅速缩小。然后我们再判断,这个缩小后的数是否可以通过两个平方数的和或一个平方数
组成,不能的话我们返回3
,能的话我们返回平方数的个数
。
class Solution {
public:
int numSquares(int n) {
while(n % 4 == 0)
{
n /= 4;
}
if(n % 8 == 7)
{
return 4;
}
int a = 0;
while(a*a <= n)
{
int b = (int)(sqrt(n - a*a));
if(a*a + b*b == n)
{
if(a == 0)
return 1;
else
return 2;
}
a += 1;
}
return 3;
}
};
理论参考链接:https://blog.csdn.net/qq_17550379/article/details/80875782