841. Keys and Rooms 钥匙和房间
有 N 個房間,開始時你位于 0 號房間。每個房間有不同的號碼:0,1,2,...,N-1,并且房間里可能有一些鑰匙能使你進入下一個房間。
在形式上,對于每個房間 i 都有一個鑰匙列表 rooms[i],每個鑰匙 rooms[i][j] 由 [0,1,...,N-1] 中的一個整數表示,其中 N = rooms.length。 鑰匙 rooms[i][j] = v 可以打開編號為 v 的房間。
最初,除 0 號房間外的其余所有房間都被鎖住。
你可以自由地在房間之間來回走動。
如果能進入每個房間返回 true,否則返回 false。
示例 1:
輸入: [[1],[2],[3],[]] 輸出: true 解釋: 我們從 0 號房間開始,拿到鑰匙 1。 之后我們去 1 號房間,拿到鑰匙 2。 然后我們去 2 號房間,拿到鑰匙 3。 最后我們去了 3 號房間。 由于我們能夠進入每個房間,我們返回 true。示例 2:
輸入:[[1,3],[3,0,1],[2],[0]] 輸出:false 解釋:我們不能進入 2 號房間。提示:
DFS
當 xxx 號房間中有 yyy 號房間的鑰匙時,我們就可以從 xxx 號房間去往 yyy 號房間。如果我們將這 nnn 個房間看成有向圖中的 nnn 個節點,那么上述關系就可以看作是圖中的 xxx 號點到 yyy 號點的一條有向邊。
這樣一來,問題就變成了給定一張有向圖,詢問從 000 號節點出發是否能夠到達所有的節點。
我們可以使用深度優先搜索的方式遍歷整張圖,統計可以到達的節點個數,并利用數組 vis\textit{vis}vis 標記當前節點是否訪問過,以防止重復訪問。
Code
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:def dfs(x: int):vis.add(x)nonlocal numnum += 1for i in rooms[x]:if i not in vis:dfs(i)vis, num = set(), 0dfs(0)return num == len(rooms)復雜度分析
-
時間復雜度:O(n+m)O(n+m)O(n+m),其中 nnn 是房間的數量,mmm 是所有房間中的鑰匙數量的總數。
-
空間復雜度:O(n)O(n)O(n),其中 nnn 是房間的數量。主要為棧空間的開銷。
總結
以上是生活随笔為你收集整理的841. Keys and Rooms 钥匙和房间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学计算机,怎么入门?
- 下一篇: 51. N-Queens N 皇后