我试图用BFS解决leetcode问题https://leetcode.com/problems/open-the-lock/,并提出了以下方法.
def openLock(self, deadends: List[str], target: str): -> int
def getNeighbors(node) ->List[str]:
neighbors = []
dirs = [-1, 1]
for i in range(len(node)):
for direction in dirs:
x = (int(node[i]) + direction) % 10
neighbors.append(node[:i] + str(x) + node[i+1:])
return neighbors
start = '0000'
if start in deadends:
return -1
queue = deque()
queue.append((start, 0))
turns = 0
visited = set()
deadends = set(deadends)
while queue:
state, turns = queue.popleft()
visited.add(state)
if state == target:
return turns
for nb in getNeighbors(state):
if nb not in visited and nb not in deadends:
queue.append((nb, turns+1))
return -1
然而,这段代码遇到了一个超过时间限制的异常,它只通过了测试用例的2/48.例如,在一个测试用例中,死区是["8887","8889","8878","8898","8788","8988","7888","9888"]
,目标是"8888"
(开始总是"0000"
),我的解决方案是TLE.我注意到,如果我本质上更改了一行并将相邻 node 添加到内部循环中的访问集,那么我的解决方案将通过该测试用例和所有其他测试用例.
for nb in getNeighbors(state):
if nb not in visited and nb not in deadends:
visited.add(nb)
queue.append((nb, turns+1))
然后,我的while循环变为
while queue:
state, turns = queue.popleft()
if state == target:
return turns
for nb in getNeighbors(state):
if nb not in visited and nb not in deadends:
visited.add(nb)
queue.append((nb, turns+1))
有人能解释为什么第一种方法会遇到TLE,而第二种方法不会?