LeetCode 279 Perfect Squares
题目
思路
从大的数指向小的数,无全图上的最短路径问题可以使用层序遍历的推广,广度优先遍历实现。(有权图使用迪杰斯特拉算法)
代码
def numSquares(n):
if n <= 0:
return 0
stack = [(n,0)]
visited = [0]*(n+1) # 避免重复推入元素
visited[n]= 1
while stack !=[]:
h = stack.pop(0)
num = h[0]
step = h[1]
if num == 0:
return step
i = 1
while num - i*i >= 0:
if visited[num-i*i] == 0:
stack.append((num-i*i,step+1))
visited[num-i*i] = 1
i += 1
优化
def numSquares(self, n: int) -> int:
if n <= 0:
return 0
stack = [(n,0)] # 队列中存储,(节点,路径长度)
visited = [0]*(n+1)
visited[n]= 1
while stack !=[]:
h = stack.pop(0)
num = h[0]
step = h[1]
i = 1
while 1:
a = num - i*i # 拿变量存下,避免多次重复计算
if a < 0:
break
if a == 0: #如果等于0,不用再推入队列再取出判断,直接返回当前路径长度加1
return step+1
if visited[a] == 0:
stack.append((a,step+1))
visited[a] = 1
i += 1