752 開啟轉盤鎖(過程分析)

2021-10-24 18:32:18 字數 1455 閱讀 9007

//對bfs的理解會更加通徹

class solution

//記錄已經走過的位置,防止走回頭路。

setvisited = new hashset<>();

//接下來就是bfs搜尋模板

queueq = new linkedlist<>();

int step = 0;

q.offer("0000");

visited.add("0000");

while(!q.isempty())

if(cur.equals(target))

for(int j = 0; j < 4; j++)

string down = minusone(cur, j);

if (!visited.contains(down)) }}

step++;

}return -1;

}//向上撥動一次

public string plusone(string s, int j)else

return new string(ch);

}//向下撥動一次

public string minusone(string s, int j) else

return new string(ch);

}}題解過程:deadends = ["0201","0101","0102","1212","2002"], target = "0103"

0000 -> 0100

-> 0001

visted的作用就是不會再從0100轉到0000了, 且0001也不會走到0000,因為這樣重複走了

0000 -> 0100 -> 0101

-> 0100 -> 0109

-> 0001 -> 0101

-> 0001 -> 0002

此時有死亡的數字判斷了

0000 -> 0100 -> 0101 (死亡數字跳過)

-> 0100 -> 0109

-> 0100 -> 0109 -> 0108

-> 0001 -> 0101 (死亡數字跳過)

-> 0001 -> 0002

-> 0001 -> 0002 -> 0102

-> 0001 -> 0002 -> 0902

......

以上是代表性的路徑

最直觀的就是 0000 -> 0100 -> 0109 -> 0108 -> 0107 -> 0106 -> 0105 -> 0104 -> 0103(0100 -> 0101路不通)

還有最簡路徑 0000 -> 0000 -> 0001 -> 0002 -> 0003 -> 0103

時間複雜度:o(n^2 * a^n + d)

空間複雜度:o(a^n + d)

其中a表示數字的個數,n表示狀態的位數,d表示陣列 deadends 的大小

752 開啟轉盤鎖

題目描述 你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一組死亡數字...

752 開啟轉盤鎖

你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一組死亡數字,一旦撥輪...

leetcode 752 開啟轉盤鎖

752.開啟轉盤鎖 你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字 0 1 2 3 4 5 6 7 8 9 每個撥輪可以自由旋 例如把 9 變為 0 0 變為 9 每次旋轉都只能旋轉乙個撥輪的一位數字。鎖的初始數字為 0000 乙個代表四個撥輪的數字的字串。列表 deadends 包含了一...