方法一(动态规划)
用memo记录每一个比n小的数的最小完全平方个数,k记录的是n开平方的整数部分。
class Solution(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
memo=[0]*(n+1)
k=1
for i in range(1,n+1):
if i==(k+1)**2:
k+=1
memo[i]=1+memo[i-k**2]
for j in range(k-1,-1,-1):
memo[i]=min(memo[i],1+memo[i-j**2])
return memo[n]
方法二(四平方和定理)
用到四平方和定理:每个正整数都可以表示为至多四个正整数的平方和。
由定理可知,每个数的表示结果只有“1,2,3,4”。依次判断其可能情况:
(1)ans = 4 ,判断是否满足推论;(在此过程中,以 4 的倍数缩小 n ,并不影响最后结果)
(2)ans = 1 ,判断缩小后的 n 是否为平方数;
(3)ans = 2 ,判断缩小后的 n 是否可以由两个平方数构成;
(4)ans = 3, 以上都不满足,则结果为 3。
class Solution(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
while n%4==0:
n/=4
if n%8==7:
return 4
num=int(n**0.5)
if num*num==n:
return 1
for i in range(1,num+1):
if n-i*i in [k*k for k in range(1,num+1)]:
return 2
return 3
合并结果2,3的情况
class Solution(object):
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
while n % 4 == 0:
n /= 4
if n % 8 == 7:
return 4
a = 0
while a**2 <= n:
b = int((n - a**2)**0.5)
if a**2 + b**2 == n:
return (not not a) + (not not b)
a += 1
return 3