Skip to content

Commit da440c1

Browse files
committed
feat: add solutions to lc problem: No.0841
No.0841.Keys and Rooms
1 parent f04f7c6 commit da440c1

File tree

6 files changed

+238
-2
lines changed

6 files changed

+238
-2
lines changed

solution/0800-0899/0841.Keys and Rooms/README.md

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,104 @@
5050

5151
<!-- 这里可写通用的实现逻辑 -->
5252

53+
DFS。
54+
5355
<!-- tabs:start -->
5456

5557
### **Python3**
5658

5759
<!-- 这里可写当前语言的特殊实现逻辑 -->
5860

5961
```python
60-
62+
class Solution:
63+
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
64+
def dfs(u):
65+
if u == n or u in vis:
66+
return
67+
vis.add(u)
68+
for v in rooms[u]:
69+
dfs(v)
70+
71+
n = len(rooms)
72+
vis = set()
73+
dfs(0)
74+
return len(vis) == n
6175
```
6276

6377
### **Java**
6478

6579
<!-- 这里可写当前语言的特殊实现逻辑 -->
6680

6781
```java
82+
class Solution {
83+
private List<List<Integer>> rooms;
84+
private Set<Integer> vis;
85+
private int n;
86+
87+
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
88+
vis = new HashSet<>();
89+
this.rooms = rooms;
90+
n = rooms.size();
91+
dfs(0);
92+
return vis.size() == n;
93+
}
94+
95+
private void dfs(int u) {
96+
if (u == n || vis.contains(u)) {
97+
return;
98+
}
99+
vis.add(u);
100+
for (int v : rooms.get(u)) {
101+
dfs(v);
102+
}
103+
}
104+
}
105+
```
106+
107+
### **C++**
108+
109+
```cpp
110+
class Solution {
111+
public:
112+
vector<vector<int>> rooms;
113+
unordered_set<int> vis;
114+
int n;
115+
116+
bool canVisitAllRooms(vector<vector<int>>& rooms) {
117+
vis.clear();
118+
this->rooms = rooms;
119+
n = rooms.size();
120+
dfs(0);
121+
return vis.size() == n;
122+
}
123+
124+
void dfs(int u) {
125+
if (u == n || vis.count(u)) return;
126+
vis.insert(u);
127+
for (int v : rooms[u]) dfs(v);
128+
}
129+
};
130+
```
68131
132+
### **Go**
133+
134+
```go
135+
func canVisitAllRooms(rooms [][]int) bool {
136+
n := len(rooms)
137+
vis := make(map[int]bool)
138+
var dfs func(u int)
139+
dfs = func(u int) {
140+
if u == n || vis[u] {
141+
return
142+
}
143+
vis[u] = true
144+
for _, v := range rooms[u] {
145+
dfs(v)
146+
}
147+
}
148+
dfs(0)
149+
return len(vis) == n
150+
}
69151
```
70152

71153
### **...**

solution/0800-0899/0841.Keys and Rooms/README_EN.md

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,100 @@ We then go to room 3. Since we were able to go to every room, we return true.
6060

6161
## Solutions
6262

63+
DFS.
64+
6365
<!-- tabs:start -->
6466

6567
### **Python3**
6668

6769
```python
68-
70+
class Solution:
71+
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
72+
def dfs(u):
73+
if u == n or u in vis:
74+
return
75+
vis.add(u)
76+
for v in rooms[u]:
77+
dfs(v)
78+
79+
n = len(rooms)
80+
vis = set()
81+
dfs(0)
82+
return len(vis) == n
6983
```
7084

7185
### **Java**
7286

7387
```java
88+
class Solution {
89+
private List<List<Integer>> rooms;
90+
private Set<Integer> vis;
91+
private int n;
92+
93+
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
94+
vis = new HashSet<>();
95+
this.rooms = rooms;
96+
n = rooms.size();
97+
dfs(0);
98+
return vis.size() == n;
99+
}
100+
101+
private void dfs(int u) {
102+
if (u == n || vis.contains(u)) {
103+
return;
104+
}
105+
vis.add(u);
106+
for (int v : rooms.get(u)) {
107+
dfs(v);
108+
}
109+
}
110+
}
111+
```
112+
113+
### **C++**
114+
115+
```cpp
116+
class Solution {
117+
public:
118+
vector<vector<int>> rooms;
119+
unordered_set<int> vis;
120+
int n;
121+
122+
bool canVisitAllRooms(vector<vector<int>>& rooms) {
123+
vis.clear();
124+
this->rooms = rooms;
125+
n = rooms.size();
126+
dfs(0);
127+
return vis.size() == n;
128+
}
129+
130+
void dfs(int u) {
131+
if (u == n || vis.count(u)) return;
132+
vis.insert(u);
133+
for (int v : rooms[u]) dfs(v);
134+
}
135+
};
136+
```
74137
138+
### **Go**
139+
140+
```go
141+
func canVisitAllRooms(rooms [][]int) bool {
142+
n := len(rooms)
143+
vis := make(map[int]bool)
144+
var dfs func(u int)
145+
dfs = func(u int) {
146+
if u == n || vis[u] {
147+
return
148+
}
149+
vis[u] = true
150+
for _, v := range rooms[u] {
151+
dfs(v)
152+
}
153+
}
154+
dfs(0)
155+
return len(vis) == n
156+
}
75157
```
76158

77159
### **...**
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
vector<vector<int>> rooms;
4+
unordered_set<int> vis;
5+
int n;
6+
7+
bool canVisitAllRooms(vector<vector<int>>& rooms) {
8+
vis.clear();
9+
this->rooms = rooms;
10+
n = rooms.size();
11+
dfs(0);
12+
return vis.size() == n;
13+
}
14+
15+
void dfs(int u) {
16+
if (u == n || vis.count(u)) return;
17+
vis.insert(u);
18+
for (int v : rooms[u]) dfs(v);
19+
}
20+
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
func canVisitAllRooms(rooms [][]int) bool {
2+
n := len(rooms)
3+
vis := make(map[int]bool)
4+
var dfs func(u int)
5+
dfs = func(u int) {
6+
if u == n || vis[u] {
7+
return
8+
}
9+
vis[u] = true
10+
for _, v := range rooms[u] {
11+
dfs(v)
12+
}
13+
}
14+
dfs(0)
15+
return len(vis) == n
16+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
private List<List<Integer>> rooms;
3+
private Set<Integer> vis;
4+
private int n;
5+
6+
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
7+
vis = new HashSet<>();
8+
this.rooms = rooms;
9+
n = rooms.size();
10+
dfs(0);
11+
return vis.size() == n;
12+
}
13+
14+
private void dfs(int u) {
15+
if (u == n || vis.contains(u)) {
16+
return;
17+
}
18+
vis.add(u);
19+
for (int v : rooms.get(u)) {
20+
dfs(v);
21+
}
22+
}
23+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
3+
def dfs(u):
4+
if u == n or u in vis:
5+
return
6+
vis.add(u)
7+
for v in rooms[u]:
8+
dfs(v)
9+
10+
n = len(rooms)
11+
vis = set()
12+
dfs(0)
13+
return len(vis) == n

0 commit comments

Comments
 (0)