思路
四平方定理
Lagrange 四平方定理: 任何一个正整数都可以表示成不超过四个整数的平方之和。
四平方定理的重要推论:
满足四数平方和定理的数n(这里要满足由四个数构成,小于四个不行),必定满足 n=4a(8b+7) n = 4a(8b + 7)
根据这个重要的推论,我们可以非常迅速的写出这样的代码:
我们首先将输入的n迅速缩小。然后我们再判断,这个缩小后的数是否可以通过两个平方数的和或一个平方数组成,不能的话我们返回3,能的话我们返回平方数的个数。
import math
class Solution(object):
def numSquares(self, n):
# dp = [0]
# for i in range(1, n+1):
# dp.append(min(dp[-j*j] for j in range(1, 1 + int(i**0.5))) + 1)
# return dp[-1]
#首先根据公式缩小n
while n % 4 == 0:
n /= 4
#满足公式,则返回4
if n % 8 == 7:
return 4
#再判断缩小后的数是否可以由一个数的平和或者两个数的平方的和组成
a = 0
while a**2 <= n:
b = int((n - a**2)**0.5)
#如果可以,返回平方的个数
if n == a**2 + b**2:
return (not not a) + (not not b)
a += 1
#如果不行,则返回3
return 3