Leetcode 開啟轉盤鎖

2021-09-19 08:25:44 字數 1188 閱讀 3990

原題 一道關於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 包含了一組死亡數字,一旦撥輪...