Skip to content

Commit b8cb983

Browse files
committed
feat: add solutions to lc problem: No.0815
No.0815.Bus Routes
1 parent efaa5b5 commit b8cb983

File tree

6 files changed

+595
-0
lines changed

6 files changed

+595
-0
lines changed

solution/0800-0899/0815.Bus Routes/README.md

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,233 @@
5050

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

53+
**方法一:建图 + BFS**
54+
55+
对于本题,我们可以将公交线路看成图中的节点,对于任意两条公交线路,如果它们有公共的公交站点,那么这两个公交线路之间就有一条边。
56+
57+
我们用 $s[i]$ 表示公交线路 $i$ 上的所有公交站点,用哈希表 $d$ 存储每个公交站对应的所有公交线路。
58+
59+
接下来我们开始建图。遍历哈希表 $d$ 中每个公交站对应的公交线路,同个公交站的任意两条公交线路之间都有一条边,因此我们可以将这些公交线路看成图中的节点,将这些节点之间的边加入图 $g$ 中。
60+
61+
接下来,我们可以通过 BFS 求出从 $source$ 到 $target$ 的最短路径,即为最少乘坐的公交车数量。
62+
63+
时间复杂度 $O(n\times m + n^2)$。其中 $n$, $m$ 分别表示公交线路的数量和公交站的数量。
64+
5365
<!-- tabs:start -->
5466

5567
### **Python3**
5668

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

5971
```python
72+
class Solution:
73+
def numBusesToDestination(self, routes: List[List[int]], source: int, target: int) -> int:
74+
if source == target:
75+
return 0
76+
77+
# 一条公交线路有哪些公交站
78+
s = [set(r) for r in routes]
6079

80+
# 一个公交站在哪些公交线路有
81+
d = defaultdict(list)
82+
for i, r in enumerate(routes):
83+
for v in r:
84+
d[v].append(i)
85+
86+
g = defaultdict(list)
87+
for ids in d.values():
88+
m = len(ids)
89+
for i in range(m):
90+
for j in range(i + 1, m):
91+
a, b = ids[i], ids[j]
92+
g[a].append(b)
93+
g[b].append(a)
94+
q = deque(d[source])
95+
ans = 1
96+
vis = set(d[source])
97+
while q:
98+
for _ in range(len(q)):
99+
i = q.popleft()
100+
if target in s[i]:
101+
return ans
102+
for j in g[i]:
103+
if j not in vis:
104+
vis.add(j)
105+
q.append(j)
106+
ans += 1
107+
return -1
61108
```
62109

63110
### **Java**
64111

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

67114
```java
115+
class Solution {
116+
public int numBusesToDestination(int[][] routes, int source, int target) {
117+
if (source == target) {
118+
return 0;
119+
}
120+
int n = routes.length;
121+
Set<Integer>[] s = new Set[n];
122+
List<Integer>[] g = new List[n];
123+
Map<Integer, List<Integer>> d = new HashMap<>();
124+
for (int i = 0; i < n; ++i) {
125+
s[i] = new HashSet<>();
126+
g[i] = new ArrayList<>();
127+
for (int v : routes[i]) {
128+
s[i].add(v);
129+
d.computeIfAbsent(v, k -> new ArrayList<>()).add(i);
130+
}
131+
}
132+
for (var ids : d.values()) {
133+
int m = ids.size();
134+
for (int i = 0; i < m; ++i) {
135+
for (int j = i + 1; j < m; ++j) {
136+
int a = ids.get(i), b = ids.get(j);
137+
g[a].add(b);
138+
g[b].add(a);
139+
}
140+
}
141+
}
142+
Deque<Integer> q = new ArrayDeque<>();
143+
Set<Integer> vis = new HashSet<>();
144+
int ans = 1;
145+
for (int v : d.get(source)) {
146+
q.offer(v);
147+
vis.add(v);
148+
}
149+
while (!q.isEmpty()) {
150+
for (int k = q.size(); k > 0; --k) {
151+
int i = q.pollFirst();
152+
if (s[i].contains(target)) {
153+
return ans;
154+
}
155+
for (int j : g[i]) {
156+
if (!vis.contains(j)) {
157+
vis.add(j);
158+
q.offer(j);
159+
}
160+
}
161+
}
162+
++ans;
163+
}
164+
return -1;
165+
}
166+
}
167+
```
168+
169+
### **C++**
170+
171+
```cpp
172+
class Solution {
173+
public:
174+
int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {
175+
if (source == target) {
176+
return 0;
177+
}
178+
int n = routes.size();
179+
vector<unordered_set<int>> s(n);
180+
vector<vector<int>> g(n);
181+
unordered_map<int, vector<int>> d;
182+
for (int i = 0; i < n; ++i) {
183+
for (int v : routes[i]) {
184+
s[i].insert(v);
185+
d[v].push_back(i);
186+
}
187+
}
188+
for (auto& [_, ids] : d) {
189+
int m = ids.size();
190+
for (int i = 0; i < m; ++i) {
191+
for (int j = i + 1; j < m; ++j) {
192+
int a = ids[i], b = ids[j];
193+
g[a].push_back(b);
194+
g[b].push_back(a);
195+
}
196+
}
197+
}
198+
queue<int> q;
199+
unordered_set<int> vis;
200+
int ans = 1;
201+
for (int v : d[source]) {
202+
q.push(v);
203+
vis.insert(v);
204+
}
205+
while (!q.empty()) {
206+
for (int k = q.size(); k; --k) {
207+
int i = q.front();
208+
q.pop();
209+
if (s[i].count(target)) {
210+
return ans;
211+
}
212+
for (int j : g[i]) {
213+
if (!vis.count(j)) {
214+
vis.insert(j);
215+
q.push(j);
216+
}
217+
}
218+
}
219+
++ans;
220+
}
221+
return -1;
222+
}
223+
};
224+
```
225+
226+
### **Go**
68227
228+
```go
229+
func numBusesToDestination(routes [][]int, source int, target int) int {
230+
if source == target {
231+
return 0
232+
}
233+
n := len(routes)
234+
s := make([]map[int]bool, n)
235+
g := make([][]int, n)
236+
d := map[int][]int{}
237+
for i, r := range routes {
238+
for _, v := range r {
239+
if s[i] == nil {
240+
s[i] = make(map[int]bool)
241+
}
242+
s[i][v] = true
243+
d[v] = append(d[v], i)
244+
}
245+
}
246+
for _, ids := range d {
247+
m := len(ids)
248+
for i := 0; i < m; i++ {
249+
for j := i + 1; j < m; j++ {
250+
a, b := ids[i], ids[j]
251+
g[a] = append(g[a], b)
252+
g[b] = append(g[b], a)
253+
}
254+
}
255+
}
256+
q := d[source]
257+
vis := map[int]bool{}
258+
for _, v := range d[source] {
259+
vis[v] = true
260+
}
261+
ans := 1
262+
for len(q) > 0 {
263+
for k := len(q); k > 0; k-- {
264+
i := q[0]
265+
q = q[1:]
266+
if s[i][target] {
267+
return ans
268+
}
269+
for _, j := range g[i] {
270+
if !vis[j] {
271+
vis[j] = true
272+
q = append(q, j)
273+
}
274+
}
275+
}
276+
ans++
277+
}
278+
return -1
279+
}
69280
```
70281

71282
### **...**

0 commit comments

Comments
 (0)