给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。(第一个我写的)
import math
class Solution(object):
def numSquares1(self, n):
"""
:type n: int
:rtype: int
"""
if n < 2:
return 1
dp = [0 for _ in range(n + 1)]
dp[0] = 0
dp[1] = 1
for i in range(2, n + 1):
squ = math.floor(math.sqrt(i))
squ_num2 = 1 if math.sqrt(i).is_integer() else float("inf")
if squ_num2 == 1:
dp[i] = 1
continue
min_squ_num = float("inf")
for j in range(squ):
squ_num = dp[(squ - j) ** 2] + dp[i - (squ - j) ** 2]
min_squ_num = min(min_squ_num, squ_num)
if min_squ_num == 2:
break
dp[i] = min(min_squ_num, squ_num2)
return dp[n]
def is_square(self, n):
sq = int(math.sqrt(n))
return sq*sq == n
def numSquares(self, n):
"""
:type n: int
:rtype: int
"""
# 为什么n % 4 = n & 3,其实n % 8 = n & 7 ,n % 16 = n & 15 你发现什么了么?
while n & 3 == 0:
n /= 4
if n & 7 == 7:
return 4
if self.is_square(n):
return 1
for i in range(1, int(math.sqrt(n))+1):
if self.is_square(n-i*i):
return 2
return 3