進階圖論應用: 解開數字鎖 Open the Lock_Leetcode #752

閱讀時間約 9 分鐘

題目敘述

題目會給我們一個4位數字的數字鎖,還有解鎖的密碼target,和陷阱數字deadends(假如遇到的話鎖會直接卡住,不能在撥動轉盤了)。

預設開始的狀態是0000,請問,最少要撥動轉盤幾次才能解鎖?


題目的原文敘述


測試範例

Example 1:

Input: deadends = ["0201","0101","0102","1212","2002"], target = "0202"
Output: 6
Explanation:
A sequence of valid moves would be "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202".
Note that a sequence like "0000" -> "0001" -> "0002" -> "0102" -> "0202" would be invalid,
because the wheels of the lock become stuck after the display becomes the dead end "0102".

Example 2:

Input: deadends = ["8888"], target = "0009"
Output: 1
Explanation: We can turn the last wheel in reverse to move from "0000" -> "0009".

Example 3:

Input: deadends = ["8887","8889","8878","8898","8788","8988","7888","9888"], target = "8888"
Output: -1
Explanation: We cannot reach the target without getting stuck.

約束條件

Constraints:

  • 1 <= deadends.length <= 500

陷阱數字的數量介於 1個~500個。

  • deadends[i].length == 4

陷阱數字也是4-digits的數字。

  • target.length == 4

解鎖密碼也是4-digits的數字。

  • target will not be in the list deadends.

題目保證 解鎖密碼不會是陷阱數字。

  • target and deadends[i] consist of digits only.

解鎖密碼和陷阱數字都是0~9的數字所構成。


演算法 映射到圖論中的最短路徑Shortest Path


可以把數字鎖的每個數字映射到圖論中的節點(代表一個狀態)

可以透過轉動一格抵達的數字彼此有一條邊連著,權重為1,代表移動成本為一步,撥動轉盤一次

那麼,原本題目所求: 從0000到解鎖密碼target的最小轉盤撥動次數 就等於 從0000到解鎖密碼target的最短路徑長度

這是一張等權重BFS在等權重的圖先天具有尋找最短路徑的特質


所以用BFS搭配N2 往上或往下撥動一格的位移向量,從出發點開始探索整張圖,當成功解鎖時,當下的步數 = 從0000到解鎖密碼target的最小轉盤撥動次數 = 從0000到解鎖密碼target的最短路徑長度

程式碼 用BFS去找等權重圖中的最短路徑Shortest Path

class Solution:
def openLock(self, deadends: List[str], target: str) -> int:

# Starting number 0000 = 0
start = 0000

# Set of deadend number
deadends = set( map(int, deadends) )

# Target number
target = int(target)

# visited set to avoid repeated traversal
seen = set([start])

# Each digit can either go up or go down
# 0 <-> 1 <-> 2 ... <-> 9 <-> 0
rotation = (+1, -1)
bfs_queue = deque( [ (start, 0) ] ) if start not in deadends else []

# Try to open the lock with BFS to find the minimal count of rotations
while bfs_queue:

cur, step = bfs_queue.popleft()

# Yeah! we meet the target number
if cur == target:
return step

# Each round, we can pick one digit and rotate it
for i in range(4):

cur_digit = (cur // (10**i)) % 10

# Each digit can either go up or go down
for r in rotation:
offset = (( cur_digit + r + 10) % 10 - cur_digit) * (10 ** i)
next_state = cur + offset

# Skip when meeting deadend numbers
if next_state in deadends: continue

# Skip when this number is seen before
if next_state in seen: continue

bfs_queue.append( (next_state, step+1) )
seen.add( next_state )

# ----------------------------------------------------
# -1 stands for No solution
return -1

複雜度分析 用BFS去找等權重圖中的最短路徑Shortest Path

時間複雜度:

從出發點開始探索整張圖,每個數字0000~9999最多拜訪一次,所需時間為O(10^4) = O(1) 常數級別。

空間複雜度:

空間成本耗費在BFS Queue上,Worst case是幾乎拜訪所有數字 = O(10^4) = O(1) 常數級別。

另外,建造deadends和seen也需要相對集合所需的空間,但是,密碼鎖的數字範圍0000~9999是固定的,所以,也可以是為常數空間O(1)。


關鍵知識點

可以把數字鎖的每個數字映射到圖論中的節點(代表一個狀態)

可以透過轉動一格抵達的數字彼此有一條邊連著,權重為1,代表移動成本為一步,撥動轉盤一次

那麼,原本題目所求: 從0000到解鎖密碼target的最小轉盤撥動次數 就等於 從0000到解鎖密碼target的最短路徑長度

這是一張等權重BFS在等權重的圖先天具有尋找最短路徑的特質


可以一起複習 最接近的迷宮出口 Nearest Exit from Entrance in Maze_Leetcode 1926這題,用到的都是同一個性質: 用BFS去找等權重的圖的最短路徑長度。


Reference:

[1] Open the Lock - LeetCode

88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 題目給定一個二維陣列maze代表迷宮的布局, 其中標記為"."的地方代表可通過,標記為"+"代表牆壁不可通過。 每次移動的時候,可以選擇往上、下、左、右移動一格。 請問從出發點entrace開始走的話,抵達迷宮出口最短距離的步數是多少? 如果無解的話,返回-1。 題目的原文敘述
題目敘述 給定一個正整數n,請找出最少用幾個完全平方數,可以讓他們的總和為n? 例如 n=12,最少用3個完全平方數就可讓他們的總和為n,因為12 = 4 + 4 + 4 題目的原文敘述 測試範例 Example 1: Input: n = 12 Output: 3 Explanat
題目敘述 圖目會給定我們一串已知變數作除法的值,以分子在前,分母在後的形式表達。 要求我們針對未知的變數除法作計算,以浮點數的形式返回答案;如果無解,返回-1.0。 題目的原文敘述 測試範例 Example 1: Input: equations = [["a","b"],["b",
題目會給定我們一個輸入陣列connections,和城市的總數目n。 輸入陣列裡面是以pair的方式儲存,(a, b) 分邊代表這條邊的起點和終點。 請問,我們需要改變多少條邊的方向,才能讓每條路徑都指向編號零號的城市( City #0)? 註: 題目還保證,在改變方向之後,一定可以讓每座城
題目敘述 題目會給我們一串相鄰矩陣isConnected,相鄰矩陣的元素值isConnected[i][j] 代表第i座城市和第j座城市是否有連通。 如果彼此有連通,則isConnected[i][j]=1。 如果彼此沒有連通,則isConnected[i][j]=0。 彼此互相有路徑可以
題目敘述 題目會給我們一棵BST二元搜索樹的根結點root,還有一個指定的目標值key。 要求我們在樹中刪除帶有這個key值的節點,並且返回更新過後二元搜索樹的樹根root。 題目的原文敘述 測試範例 Example 1: Input: root = [5,3,6,2,4,null,
題目敘述 題目給定一個二維陣列maze代表迷宮的布局, 其中標記為"."的地方代表可通過,標記為"+"代表牆壁不可通過。 每次移動的時候,可以選擇往上、下、左、右移動一格。 請問從出發點entrace開始走的話,抵達迷宮出口最短距離的步數是多少? 如果無解的話,返回-1。 題目的原文敘述
題目敘述 給定一個正整數n,請找出最少用幾個完全平方數,可以讓他們的總和為n? 例如 n=12,最少用3個完全平方數就可讓他們的總和為n,因為12 = 4 + 4 + 4 題目的原文敘述 測試範例 Example 1: Input: n = 12 Output: 3 Explanat
題目敘述 圖目會給定我們一串已知變數作除法的值,以分子在前,分母在後的形式表達。 要求我們針對未知的變數除法作計算,以浮點數的形式返回答案;如果無解,返回-1.0。 題目的原文敘述 測試範例 Example 1: Input: equations = [["a","b"],["b",
題目會給定我們一個輸入陣列connections,和城市的總數目n。 輸入陣列裡面是以pair的方式儲存,(a, b) 分邊代表這條邊的起點和終點。 請問,我們需要改變多少條邊的方向,才能讓每條路徑都指向編號零號的城市( City #0)? 註: 題目還保證,在改變方向之後,一定可以讓每座城
題目敘述 題目會給我們一串相鄰矩陣isConnected,相鄰矩陣的元素值isConnected[i][j] 代表第i座城市和第j座城市是否有連通。 如果彼此有連通,則isConnected[i][j]=1。 如果彼此沒有連通,則isConnected[i][j]=0。 彼此互相有路徑可以
題目敘述 題目會給我們一棵BST二元搜索樹的根結點root,還有一個指定的目標值key。 要求我們在樹中刪除帶有這個key值的節點,並且返回更新過後二元搜索樹的樹根root。 題目的原文敘述 測試範例 Example 1: Input: root = [5,3,6,2,4,null,
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
今天要分享圖條圖的進階應用,直條圖在數據呈現是一個極為常用的圖表,常用於同類型的數據間的比較,例如下圖的例子,每個人的業績狀況。 🔒改造前 如果這樣充其量就是把數字圖表化,能呈現出來的就是誰高誰低,通常在業績的表達中,還有添加一些有沒有達標,或這個業績的表現屬於哪一個等級,這時候一般的直條圖要
Thumbnail
當我們決定踏上崎嶇山徑,逃離城市的喧囂,探索自然的美麗時,我們經常面臨一個讓人頭痛的問題:無信號。正是在這種挑戰的環境中,Hikingbook APP 融入了我們的生活,為山林探險者提供了一個寶貴的工具,讓我們能夠更輕鬆地探索大自然的神奇,無需擔心與現實世界的斷絕。
Thumbnail
今天要介紹的圖表是由環圈圖變形而來的,一般如果要將比例數據可視化,都會習慣使用圓形圖,但是用圓形圖一次只能比較一筆資料,例如有4個季別的資料,那麼就需要4個圓餅圖。 這樣如果要比較四個季別的相互關聯,就很難以圖視的直接看出來,必須藉由數據才能夠比較,所以這邊就利用環圈圖把4個季別的內容全部融入
Thumbnail
這篇文章想要聊一下,在使用ControlNet的reference_only時,因為原始參考圖實在太過於模糊,造成生產出來的圖片品質不佳的情況下要怎麼使用一些技巧提高參考圖的精細度。
Thumbnail
這篇文章要來分享的是,怎麼把一張糊掉的圖精細化。 這個問題最主要的對象是已經有明顯的提示詞,並且以ControlNet的refernece_only來生產的圖。
Thumbnail
在上一篇文章中,我使用人偶圖產出了一個姿勢正確,但是手指錯亂且臉型崩潰的半成品圖,這一篇我要繼續修正這些問題,得到一個草稿圖,再使用這個草稿製作大張的完成圖。
Thumbnail
前言 本篇要介紹一個流程,讓我們可以使用人偶姿勢生成網站或App來製作特意的姿勢與角度,並且經過一套流程之後,轉化成我們要的人物。 在使用Stable Diffusion生成圖片時,最常遇見的問題是人物的動作或位置不照我們的心意生成,尤其是一些高動態或不常見的姿勢與角度,或者手持物品,在某些模型上是
Thumbnail
現在這個時代所出現的人類,其實是從過往七大能量中心的人類所演變而來的,而再早之前所處的人類,更只有五個能量中心或三個能量中心而已. 為了達到這些目標,七個能量中心所構成的人類會運用他們的頭腦所構思的策略完成,而這種文化和方式,就延續至我們現在這個時代的擁有九個能量中心的我們.
Thumbnail
這篇文章會延續上一集所談過的自我實現的第二條道路,也就是以外在環境作軸線的自我發展的道路. 可能會說得深入一些,但篇幅始終有限,首先,人類圖裏紅色和黑色的太陽地球組合以及同樣是兩邊紅色和黑色的月亮南北交點是本次的重點.這裏可以說有四組,但是有先後順序的.
Thumbnail
作者:小咖PPT曹學斌 吸~~,請先深吸一口氣吧! 關於多圖排列,現在我們進入珠峰的高度,用PPT,做出設計師等級的多圖排版風格,風景美得讓人無法呼吸! 你準備好了嗎? 記住兩個口訣,帶你進入高顏值的PPT美景吧! A 化整為零 (分割) B 交集成圖 (交集)
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
今天要分享圖條圖的進階應用,直條圖在數據呈現是一個極為常用的圖表,常用於同類型的數據間的比較,例如下圖的例子,每個人的業績狀況。 🔒改造前 如果這樣充其量就是把數字圖表化,能呈現出來的就是誰高誰低,通常在業績的表達中,還有添加一些有沒有達標,或這個業績的表現屬於哪一個等級,這時候一般的直條圖要
Thumbnail
當我們決定踏上崎嶇山徑,逃離城市的喧囂,探索自然的美麗時,我們經常面臨一個讓人頭痛的問題:無信號。正是在這種挑戰的環境中,Hikingbook APP 融入了我們的生活,為山林探險者提供了一個寶貴的工具,讓我們能夠更輕鬆地探索大自然的神奇,無需擔心與現實世界的斷絕。
Thumbnail
今天要介紹的圖表是由環圈圖變形而來的,一般如果要將比例數據可視化,都會習慣使用圓形圖,但是用圓形圖一次只能比較一筆資料,例如有4個季別的資料,那麼就需要4個圓餅圖。 這樣如果要比較四個季別的相互關聯,就很難以圖視的直接看出來,必須藉由數據才能夠比較,所以這邊就利用環圈圖把4個季別的內容全部融入
Thumbnail
這篇文章想要聊一下,在使用ControlNet的reference_only時,因為原始參考圖實在太過於模糊,造成生產出來的圖片品質不佳的情況下要怎麼使用一些技巧提高參考圖的精細度。
Thumbnail
這篇文章要來分享的是,怎麼把一張糊掉的圖精細化。 這個問題最主要的對象是已經有明顯的提示詞,並且以ControlNet的refernece_only來生產的圖。
Thumbnail
在上一篇文章中,我使用人偶圖產出了一個姿勢正確,但是手指錯亂且臉型崩潰的半成品圖,這一篇我要繼續修正這些問題,得到一個草稿圖,再使用這個草稿製作大張的完成圖。
Thumbnail
前言 本篇要介紹一個流程,讓我們可以使用人偶姿勢生成網站或App來製作特意的姿勢與角度,並且經過一套流程之後,轉化成我們要的人物。 在使用Stable Diffusion生成圖片時,最常遇見的問題是人物的動作或位置不照我們的心意生成,尤其是一些高動態或不常見的姿勢與角度,或者手持物品,在某些模型上是
Thumbnail
現在這個時代所出現的人類,其實是從過往七大能量中心的人類所演變而來的,而再早之前所處的人類,更只有五個能量中心或三個能量中心而已. 為了達到這些目標,七個能量中心所構成的人類會運用他們的頭腦所構思的策略完成,而這種文化和方式,就延續至我們現在這個時代的擁有九個能量中心的我們.
Thumbnail
這篇文章會延續上一集所談過的自我實現的第二條道路,也就是以外在環境作軸線的自我發展的道路. 可能會說得深入一些,但篇幅始終有限,首先,人類圖裏紅色和黑色的太陽地球組合以及同樣是兩邊紅色和黑色的月亮南北交點是本次的重點.這裏可以說有四組,但是有先後順序的.
Thumbnail
作者:小咖PPT曹學斌 吸~~,請先深吸一口氣吧! 關於多圖排列,現在我們進入珠峰的高度,用PPT,做出設計師等級的多圖排版風格,風景美得讓人無法呼吸! 你準備好了嗎? 記住兩個口訣,帶你進入高顏值的PPT美景吧! A 化整為零 (分割) B 交集成圖 (交集)