给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...
)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例 1:
输入: n =12
输出: 3 解释:12 = 4 + 4 + 4.
示例 2:
输入: n =13
输出: 2 解释:13 = 4 + 9.
四平方数和定理(theorem on the sum of foursquares)亦称拉格朗日四平方数和定理。四平方数和问题是著名的数论问题.由拉格朗日(La-grange, J.-L.)最终解决,从而有上面的定理名字.该定理断言:每个正整数均可表为四个整数的平方和(其中有些整数可以为零)。
定理: 当n是形如4^α*(8k+7) (α≥0, k≥0)的正整数时, n不能表为三个整数的平方和.
证: 对任意整数x有
x²≡0,1或4(mod 8) (7)
易知, x₁²+x₂²+x₃²≢7(mod 8). 当α=0时, 定理成立. 假设对α=l (l≥0)时成立. 当α=l+1时, 若有4^(l+1)*(8k₁+7)=x₁²+x₂²+x₃², 则必有x₁²+x₂²+x₃²≡0或4(mod 8), 进而式(7)推出x₁≡x₂≡x₃≡0(mod 2).
所以有4^l*(8k₁+7)=(x₁/2)²+(x₂/2)²+(x₃/2)². 这和归纳假设矛盾, 所以定理对α=l+1也成立. 证毕.
定理6: n=2*4^α (α≥0)不能表为四个正平方数之和.
证: 当α=0时, 即n=2, 该定理明显成立. 假设定理对α≥l (l≥0)时成立, 当α=l+1时, 若2*4^(l+1)=x₁²+x₂²+x₃²+x₄², 当x₁,x₂,x₃,x₄为两奇两偶时, 那么x₁²+x₂²+x₃²+x₄²≡2(mod 4)不可能, 所以x₁,x₂,x₃,x₄都为偶数, 则有2*4^l=(x₁/2)²+(x₂/2)²+(x₃/2)²+(x₄/2)², 这和归纳假设矛盾, 所以定理对α=l+1也成立. 证毕.
(定理证明来源:https://tieba.baidu.com/p/5056466566?red_tag=1873832645&traceid=)
下面的解只用到了上面的定理:
class Solution(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
#如果满足式子条件返回4
temp = n
while temp % 4 == 0:
temp/=4
if temp % 8 == 7:
return 4
#否则寻找是否有两个整数的平方能构成n
a = 0
while a**2<=n:
b = int((n - a**2)**0.5)
if a**2 + b**2 == n:
if a!=0 and b!=0:
return 2
else:
return 1
a+=1
#都不行就返回3
return 3