841. 鑰匙和房間
在形式上,對於每個房間 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 號房間。
這道題明顯是使用bfs來做的,但是這道題的bfs和之前的有點不一樣。主要是裡面有乙個套娃的操作。我們有門,門裡又有鑰匙,鑰匙又對應門。。。。迴圈下去。
這道題還有乙個細節就是visited儲存的是門的資訊,包括這次的門,和門中鑰匙能開的下次門。但是queue中只包含的有本次門中鑰匙下一次能開的不重複的門的資訊。所以我們這裡需要分兩次對之後的門資訊進行儲存。
class
solution
:def
canvisitallrooms
(self, rooms: list[list[
int]])
->
bool
: visited =[0
] start_key =
queue = collections.deque(
)for key in rooms[0]
:if key not
in visited:
#加入的是走過的房間號
for key1 in rooms[key]
:if key1 not
in visited:
#queue裡面是去過的房間裡面的鑰匙
while queue:
num = queue.popleft(
)#彈出的是房間鑰匙,如果鑰匙對應的房間沒有去過,則加入visited
for key in rooms[num]
:#房間內的鑰匙可以開啟的門
if key not
in visited:
#沒去過就加入visited
for key1 in rooms[key]
:#房間內鑰匙可以開啟的房間裡面的鑰匙
if key1 not
in visited:
return
true
iflen
(visited)
==len
(rooms)
else
false
之後看了官方的題解,還有一些簡便的方法:(我之前寫的有點複雜了)
class
solution
:def
canvisitallrooms
(self, rooms: list[list[
int]])
->
bool
: visited, queue =,[
0]while queue:
room_index = queue.pop(
)for key in rooms[room_index]
:if key not
in visited:
visited.add(key)
queue.insert(
0,key)
return
len(visited)
==len
(rooms)
and-rooms/solution/7xing-dfs-8xing-bfs-liang-chong-fang-fa-san-chong-
/
使用dfs解這道題:
class
solution
:def
canvisitallrooms
(self, rooms: list[list[
int]])
->
bool
: visited =
defdfs
(room_index,visited)
: visited.add(room_index)
for key in rooms[room_index]
:if key not
in visited: dfs(key,visited)
dfs(
0,visited)
return
len(visited)
==len
(rooms)
and-rooms/solution/7xing-dfs-8xing-bfs-liang-chong-fang-fa-san-chong-
/
leetcode841 鑰匙和房間
有 n 個房間,開始時你位於 0 號房間。每個房間有不同的號碼 0,1,2,n 1,並且房間裡可能有一些鑰匙能使你進入下乙個房間。在形式上,對於每個房間 i 都有乙個鑰匙列表 rooms i 每個鑰匙 rooms i j 由 0,1,n 1 中的乙個整數表示,其中 n rooms.length。鑰匙...
leetcode 841 鑰匙和房間
有n個房間,開始時你位於0號房間。每個房間有不同的號碼 0,1,2,n 1,並且房間裡可能有一些鑰匙能使你進入下乙個房間。在形式上,對於每個房間i都有乙個鑰匙列表rooms i 每個鑰匙rooms i j 由 0,1,n 1 中的乙個整數表示,其中n rooms.length。鑰匙rooms i j...
LeetCode 841 鑰匙和房間
有n個房間,開始時你位於0號房間。每個房間有不同的號碼 0,1,2,n 1,並且房間裡可能有一些鑰匙能使你進入下乙個房間。在形式上,對於每個房間i都有乙個鑰匙列表rooms i 每個鑰匙rooms i j 由 0,1,n 1 中的乙個整數表示,其中n rooms.length。鑰匙rooms i j...