LeetCode學習記錄(2) 開啟轉盤鎖

2021-08-30 13:48:55 字數 2692 閱讀 2395

你有乙個帶有四個圓形撥輪的轉盤鎖。每個撥輪都有10個數字:'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'。每個撥輪可以自由旋**例如把'9'變為'0''0'變為'9'。每次旋轉都只能旋轉乙個撥輪的一位數字。

鎖的初始數字為'0000',乙個代表四個撥輪的數字的字串。

列表deadends包含了一組死亡數字,一旦撥輪的數字和列表裡的任何乙個元素相同,這個鎖將會被永久鎖定,無法再被旋轉。

字串target代表可以解鎖的數字,你需要給出最小的旋轉次數,如果無論如何不能解鎖,返回 -1。

示例 1:

輸入:deadends = ["0201","0101","0102","1212","2002"], target = "0202"

輸出:6

解釋:可能的移動序列為 "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202"。

注意 "0000" -> "0001" -> "0002" -> "0102" -> "0202" 這樣的序列是不能解鎖的,

因為當撥動到 "0102" 時這個鎖就會被鎖定。

示例 2:

輸入: deadends = ["8888"], target = "0009"

輸出:1

解釋:把最後一位反向旋轉一次即可 "0000" -> "0009"。

示例 3:

輸入: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888"

輸出:-1

解釋:無法旋轉到目標數字且不被鎖定。

示例 4:

輸入: deadends = ["0000"], target = "8888"

輸出:-1

死亡列表deadends的長度範圍為[1, 500]

目標數字target不會在deadends之中。

每個deadendstarget中的字串的數字會在 10,000 個可能的情況'0000''9999'中產生。

解題思路:剛開始單向搜尋的思路,即從「0000」出發,遍歷它的鄰近的組合,不是目標的,加入到已經訪問過的佇列到中,並加入到佇列中,等待下一次迴圈開始,後領扣時間超時。改用雙向搜尋,從目標和「0000」兩邊一起出發,哪邊的當前層集合的待檢測密碼鎖數目少,就檢測哪一邊。當其中有乙個集合為0表示斷路,不可能接通。當其中乙個集合中的鄰居包含在另外乙個集合當中則表示連線成功。

/* 單向搜尋,效率 低下

public int openlock(string deadends, string target)

//查詢這個鎖是不是已經使用過了

if(findused(visits,neibor))

//查詢這個鎖是不是死亡鎖

if(!findused(arrays.aslist(deadends),neibor)) }}

count++;

} return -1;

}*//* * 雙向搜尋,效率快

*/public int openlock(string deadends, string target)

if (target.equals(init))

setset1 = new hashset<>();

set1.add(init);

setset2 = new hashset<>();

set2.add(target);

int count=0;

while (!set1.isempty() && !set2.isempty())

setset3 = new hashset<>();

for (string curlock : set1)

if (!dead.contains(nextlock) && !visited.contains(nextlock)) }}

count++;

set1 = set3;

} return -1;

} private boolean findused(listvisits, string neibor)

} return false;

} //遍歷當前鎖的所有鄰近鎖

public static listfindneibors(string currlock) {

int size=currlock.length();

listresult=new arraylist();

for(int i=0;i感謝下面兩個鏈結的大神。

單向搜尋參考:

雙向搜尋參考:

學習記錄2

pv操作同步過程 對訊號燈狀態進行改變,p呼叫一次 1,v呼叫一次 1。p操作 p s 是乙個原語操作,p操作執行 s 若s為負數,呼叫p s 的程序被阻塞,放到等待佇列q中。p s v操作 v s 剛好與p s 操作相反,v操作執行 s 若s為大於0,繼續執行 s 0,從訊號燈等待佇列移出乙個程序...

學習記錄2

1 如果電腦螢幕顯示異常 安裝360顯示卡驅動 3 win10虛擬機器未聯網,橋接模式沒有作用,勾選nta模式,用於共享主機的ip位址並重新啟動電腦 4 安裝cad如果安裝不成功,安裝路徑資料夾名稱可以修改為英文 5 虛擬機器安裝win10非常卡,將虛擬機器執行記憶體調大,由1gb調整為4gb 6 ...

學習記錄2

建立 django 子應用 新生成的檔案有 migrations 目錄用於存放資料庫遷移歷史檔案 models.py 使用者儲存資料庫模型類 tests.py 用於開發測試用例,編寫單元測試 views.py 用於編寫web應用檢視 1 直接新增 book 分界線 什麼是 orm 有點像 json ...