[279][中等][动态规划][背包][BFS] 完全平方数
最后更新于
最后更新于
class Solution:
def numSquares(self, n: int) -> int:
squares = [i ** 2 for i in range(int(math.sqrt(n)) + 1)]
dp = list(range(n + 1))
for i in range(1, n + 1):
for sqr in squares:
if sqr > i:
break
dp[i] = min(dp[i], dp[i - sqr] + 1)
return dp[-1]class Solution:
def numSquares(self, n: int) -> int:
squares = [i ** 2 for i in range(1, int(math.sqrt(n)) + 1)]
if n == 0:
return 0
queue, seen = [n], set([n])
steps = 0
while queue:
steps += 1 # 遍历到下一层, 数量加1
num_current_layer = len(queue) # 当前层中结点的数量
for _ in range(num_current_layer): # 遍历当期层中的所有结点
number = queue.pop(0)
for sqr in squares:
if sqr > number:
break
left = number - sqr
if left == 0:
return steps
if left not in seen:
seen.add(left)
queue.append(left)
return stepsclass Solution:
def numSquares(self, n: int) -> int:
squares = [i ** 2 for i in range(1, int(math.sqrt(n)) + 1)]
@lru_cache(None)
def dfs(number):
if number == 0:
return 0
min_steps = 1e12
for sqr in squares:
if sqr > number:
break
min_steps = min(min_steps, dfs(number - sqr) + 1)
return min_steps
return dfs(n)