原题 一道关于BFS的题目
先上代码:
class Solution(object):
def openLock(self, deadends, target):
#这里转为SET类很有必要。
deadends = set(deadends)
#先判断是否是特殊情况。
if "0000" in deadends or target in deadends:
return -1
#创建初始队和已访问,这里采用双向搜索。
q1,v1 = set(["0000"]), set(["0000"])
q2,v2 = set([target]), set([target])
#计次
t = 1
while q1 and q2:
newq = set()
for s in q1:
#生成临近密码,我觉得这种表达已经非常精简了,可以将9和0的情况包含在内。
#当然表达法不唯一,也不是重点。
s1 = [s[:i] + str(int(s[i])+9)[-1] + s[i+1:] for i in range(4)]
s2 = [s[:i] + str(int(s[i])+1)[-1] + s[i+1:] for i in range(4)]
#防问密码
for i in s1+s2:
if i in v2:
return t
#不过则入队
if not i in deadends:
v1.add(i)
newq.append(i)
#计数加一
t += 1
#判断是否转变方向,选取更窄的一侧
if len(newq) < len(q2):
q1 = newq
continue
#转向
q1, q2 = q2, newq
v1, v2 = v2, v1
return -1
一开始我的解法总是超时,抄了份答案后发现解法同其他人几乎一摸一样,速度却慢了很多很多。对比后发现仅仅是队的类型:用的是List仅此而已,改过后瞬间就AC了。
查阅后发现:官网wiki
CSDN上的翻译: BY 咕叽咕叽小菜鸟
我服了,但还是不太理解为什么list要慢一个量级