Skip to content

Commit 1614694

Browse files
committed
feat: add solutions to lcci problem: No.04.01
No.04.01.Route Between Nodes
1 parent c9f0181 commit 1614694

File tree

6 files changed

+488
-0
lines changed

6 files changed

+488
-0
lines changed

lcci/04.01.Route Between Nodes/README.md

+201
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,223 @@
3131

3232
<!-- 这里可写通用的实现逻辑 -->
3333

34+
**方法一:DFS**
35+
36+
**方法二:BFS**
37+
3438
<!-- tabs:start -->
3539

3640
### **Python3**
3741

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

4044
```python
45+
class Solution:
46+
def findWhetherExistsPath(self, n: int, graph: List[List[int]], start: int, target: int) -> bool:
47+
def dfs(u):
48+
if u == target:
49+
return True
50+
for v in g[u]:
51+
if v not in vis:
52+
vis.add(v)
53+
if dfs(v):
54+
return True
55+
return False
4156

57+
g = defaultdict(list)
58+
for u, v in graph:
59+
g[u].append(v)
60+
vis = {start}
61+
return dfs(start)
62+
```
63+
64+
```python
65+
class Solution:
66+
def findWhetherExistsPath(self, n: int, graph: List[List[int]], start: int, target: int) -> bool:
67+
g = defaultdict(list)
68+
for u, v in graph:
69+
g[u].append(v)
70+
q = deque([start])
71+
vis = {start}
72+
while q:
73+
u = q.popleft()
74+
if u == target:
75+
return True
76+
for v in g[u]:
77+
if v not in vis:
78+
vis.add(v)
79+
q.append(v)
80+
return False
4281
```
4382

4483
### **Java**
4584

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

4887
```java
88+
class Solution {
89+
public boolean findWhetherExistsPath(int n, int[][] graph, int start, int target) {
90+
Map<Integer, List<Integer>> g = new HashMap<>();
91+
for (int[] e : graph) {
92+
g.computeIfAbsent(e[0], k -> new ArrayList<>()).add(e[1]);
93+
}
94+
Set<Integer> vis = new HashSet<>();
95+
vis.add(start);
96+
return dfs(start, target, g, vis);
97+
}
98+
99+
private boolean dfs(int u, int target, Map<Integer, List<Integer>> g, Set<Integer> vis) {
100+
if (u == target) {
101+
return true;
102+
}
103+
for (int v : g.getOrDefault(u, Collections.emptyList())) {
104+
if (!vis.contains(v)) {
105+
vis.add(v);
106+
if (dfs(v, target, g, vis)) {
107+
return true;
108+
}
109+
}
110+
}
111+
return false;
112+
}
113+
}
114+
```
115+
116+
```java
117+
class Solution {
118+
public boolean findWhetherExistsPath(int n, int[][] graph, int start, int target) {
119+
Map<Integer, List<Integer>> g = new HashMap<>();
120+
for (int[] e : graph) {
121+
g.computeIfAbsent(e[0], k -> new ArrayList<>()).add(e[1]);
122+
}
123+
Deque<Integer> q = new ArrayDeque<>();
124+
q.offer(start);
125+
Set<Integer> vis = new HashSet<>();
126+
vis.add(start);
127+
while (!q.isEmpty()) {
128+
int u = q.poll();
129+
if (u == target) {
130+
return true;
131+
}
132+
for (int v : g.getOrDefault(u, Collections.emptyList())) {
133+
if (!vis.contains(v)) {
134+
vis.add(v);
135+
q.offer(v);
136+
}
137+
}
138+
}
139+
return false;
140+
}
141+
}
142+
```
143+
144+
### **C++**
145+
146+
```cpp
147+
class Solution {
148+
public:
149+
bool findWhetherExistsPath(int n, vector<vector<int>>& graph, int start, int target) {
150+
unordered_map<int, vector<int>> g;
151+
for (auto& e : graph) g[e[0]].push_back(e[1]);
152+
unordered_set<int> vis{{start}};
153+
return dfs(start, target, g, vis);
154+
}
155+
156+
bool dfs(int u, int& target, unordered_map<int, vector<int>>& g, unordered_set<int>& vis) {
157+
if (u == target) return true;
158+
for (int& v : g[u])
159+
{
160+
if (!vis.count(v))
161+
{
162+
vis.insert(v);
163+
if (dfs(v, target, g, vis)) return true;
164+
}
165+
}
166+
return false;
167+
}
168+
};
169+
```
170+
171+
```cpp
172+
class Solution {
173+
public:
174+
bool findWhetherExistsPath(int n, vector<vector<int>>& graph, int start, int target) {
175+
unordered_map<int, vector<int>> g;
176+
for (auto& e : graph) g[e[0]].push_back(e[1]);
177+
queue<int> q{{start}};
178+
unordered_set<int> vis{{start}};
179+
while (!q.empty())
180+
{
181+
int u = q.front();
182+
if (u == target) return true;
183+
q.pop();
184+
for (int v : g[u])
185+
{
186+
if (!vis.count(v))
187+
{
188+
vis.insert(v);
189+
q.push(v);
190+
}
191+
}
192+
}
193+
return false;
194+
}
195+
};
196+
```
197+
198+
### **Go**
199+
200+
```go
201+
func findWhetherExistsPath(n int, graph [][]int, start int, target int) bool {
202+
g := map[int][]int{}
203+
for _, e := range graph {
204+
u, v := e[0], e[1]
205+
g[u] = append(g[u], v)
206+
}
207+
vis := map[int]bool{start: true}
208+
var dfs func(int) bool
209+
dfs = func(u int) bool {
210+
if u == target {
211+
return true
212+
}
213+
for _, v := range g[u] {
214+
if !vis[v] {
215+
vis[v] = true
216+
if dfs(v) {
217+
return true
218+
}
219+
}
220+
}
221+
return false
222+
}
223+
return dfs(start)
224+
}
225+
```
49226

227+
```go
228+
func findWhetherExistsPath(n int, graph [][]int, start int, target int) bool {
229+
g := map[int][]int{}
230+
for _, e := range graph {
231+
u, v := e[0], e[1]
232+
g[u] = append(g[u], v)
233+
}
234+
q := []int{start}
235+
vis := map[int]bool{start: true}
236+
for len(q) > 0 {
237+
u := q[0]
238+
if u == target {
239+
return true
240+
}
241+
q = q[1:]
242+
for _, v := range g[u] {
243+
if !vis[v] {
244+
vis[v] = true
245+
q = append(q, v)
246+
}
247+
}
248+
}
249+
return false
250+
}
50251
```
51252

52253
### **...**

0 commit comments

Comments
 (0)