日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

841. Keys and Rooms 钥匙和房间

發布時間:2024/5/17 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 號房間。

提示:

  • 1 <= rooms.length <=?1000
  • 0 <= rooms[i].length <= 1000
  • 所有房間中的鑰匙數量總計不超過?3000。
  • 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 钥匙和房间的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。