perfect_nums = [i * i for i in range(1, int(n**0.5)+1)]
此時我們就可以建構出這個問題的樹是如何,以 n = 12 為例子,perfect_nums = [1, 4, 9] ,這個樹的樣子就會長得像這樣。
[12]
[11, 8, 9]
[[10, 7, 2], [7, 4], [2]]
...
class Solution:
def numSquares(self, n: int) -> int:
perfect_nums = [i ** 2 for i in range(1, int(n**0.5)+1)]
@lru_cache(None)
def dp(n):
if n == 0:
return 0
return 1 + min([dp(n-num) for num in perfect_nums if num <= n])
return dp(n)
class Solution:
def numSquares(self, n: int) -> int:
perfect_nums = [i * i for i in range(1, int(n**0.5)+1)]
queue = deque([n])
level = 0
while queue:
level += 1
size = len(queue)
for i in range(size):
node = queue.popleft()
for child in perfect_nums:
if child == node:
return level
elif child > node:
break
else:
queue.append(node - child)