給定正整數 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