原題 一道關於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)
#計數加一
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要慢乙個量級
LeetCode 開啟轉盤鎖
q 你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一組死亡數字,一旦...
LeetCode 開啟轉盤鎖 C
題目鏈結 題目描述 你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表deadends包含了一組死...
開啟轉盤鎖
你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一組死亡數字,一旦撥輪...