leetcode 841 鑰匙和房間

2021-10-08 18:20:07 字數 2656 閱讀 3601

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...