class Solution:
def numSquares(self, n: int) -> int:
def dfs(target):
if target == 0:
return 0
res = target
for i in range(1, target):
if i * i > target:
break
res = min(res, 1 + dfs(target - i * i))
return res
return dfs(n)class Solution:
def numSquares(self, n: int) -> int:
memo = {}
def dfs(target):
if target == 0:
return 0
if target in memo:
return memo[target]
res = target
for i in range(1, target + 1):
if i * i > target:
break
res = min(res, 1 + dfs(target - i * i))
memo[target] = res
return res
return dfs(n)class Solution:
def numSquares(self, n: int) -> int:
dp = [n] * (n + 1)
dp[0] = 0
for target in range(1, n + 1):
for s in range(1, target + 1):
square = s * s
if target - square < 0:
break
dp[target] = min(dp[target], 1 + dp[target - square])
return dp[n]class Solution:
def numSquares(self, n: int) -> int:
q = deque()
seen = set()
res = 0
q.append(0)
while q:
res += 1
for _ in range(len(q)):
cur = q.popleft()
s = 1
while s * s + cur <= n:
nxt = cur + s * s
if nxt == n:
return res
if nxt not in seen:
seen.add(nxt)
q.append(nxt)
s += 1
return resclass Solution:
def numSquares(self, n: int) -> int:
while n % 4 == 0:
n //= 4
if n % 8 == 7:
return 4
def isSquareNum(num):
s = int(math.sqrt(num))
return s * s == num
if isSquareNum(n):
return 1
i = 1
while i * i <= n:
if isSquareNum(n - i * i):
return 2
i += 1
return 3