Skip to content

Commit 638869e

Browse files
committed
feat: add solutions to lc problem: No.1377
No.1377: Frog Position After T Seconds
1 parent 1ed702f commit 638869e

File tree

7 files changed

+276
-141
lines changed

7 files changed

+276
-141
lines changed

solution/1300-1399/1377.Frog Position After T Seconds/README.md

Lines changed: 107 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,26 @@
6262

6363
**方法一:BFS**
6464

65+
我们先根据题目给出的无向树的边,建立一个邻接表 $g$,其中 $g[u]$ 表示顶点 $u$ 的所有相邻顶点。
66+
67+
然后,我们定义以下数据结构:
68+
69+
- 队列 $q$,用于存储每一轮搜索的顶点及其概率,初始时 $q = [(1, 1.0)]$,表示青蛙在顶点 $1$ 的概率为 $1.0$;
70+
- 数组 $vis$,用于记录每个顶点是否被访问过,初始时 $vis[1] = true$,其余元素均为 $false$。
71+
72+
接下来,我们开始进行广度优先搜索。
73+
74+
在每一轮搜索中,我们每次取出队首元素 $(u, p)$,其中 $u$ 和 $p$ 分别表示当前顶点及其概率。当前顶点 $u$ 的相邻顶点中未被访问过的顶点的个数记为 $cnt$。
75+
76+
- 如果 $u = target$,说明青蛙已经到达目标顶点,此时我们判断青蛙是否在 $t$ 秒到达目标顶点,或者不到 $t$ 秒到达目标顶点但是无法再跳跃到其它顶点(即 $t=0$ 或者 $cnt=0$)。如果是,则返回 $p$,否则返回 $0$。
77+
- 如果 $u \neq target$,那么我们将概率 $p$ 均分给 $u$ 的所有未被访问过的相邻顶点,然后将这些顶点加入队列 $q$ 中,并且将这些顶点标记为已访问。
78+
79+
在一轮搜索结束后,我们将 $t$ 减少 $1$,然后继续进行下一轮搜索,直到队列为空或者 $t \lt 0$。
80+
81+
最后,若青蛙仍然没有到达目标顶点,那么我们返回 $0$。
82+
83+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是无向树的顶点数。
84+
6585
<!-- tabs:start -->
6686

6787
### **Python3**
@@ -83,12 +103,13 @@ class Solution:
83103
while q and t >= 0:
84104
for _ in range(len(q)):
85105
u, p = q.popleft()
86-
nxt = [v for v in g[u] if not vis[v]]
87-
if u == target and (not nxt or t == 0):
88-
return p
89-
for v in nxt:
90-
vis[v] = True
91-
q.append((v, p / len(nxt)))
106+
cnt = sum(not vis[v] for v in g[u])
107+
if u == target:
108+
return p if cnt * t == 0 else 0
109+
for v in g[u]:
110+
if not vis[v]:
111+
vis[v] = True
112+
q.append((v, p / cnt))
92113
t -= 1
93114
return 0
94115
```
@@ -102,7 +123,7 @@ class Solution {
102123
public double frogPosition(int n, int[][] edges, int t, int target) {
103124
List<Integer>[] g = new List[n + 1];
104125
Arrays.setAll(g, k -> new ArrayList<>());
105-
for (int[] e : edges) {
126+
for (var e : edges) {
106127
int u = e[0], v = e[1];
107128
g[u].add(v);
108129
g[v].add(u);
@@ -111,26 +132,27 @@ class Solution {
111132
q.offer(new Pair<>(1, 1.0));
112133
boolean[] vis = new boolean[n + 1];
113134
vis[1] = true;
114-
while (!q.isEmpty() && t >= 0) {
135+
for (; !q.isEmpty() && t >= 0; --t) {
115136
for (int k = q.size(); k > 0; --k) {
116-
Pair<Integer, Double> x = q.poll();
137+
var x = q.poll();
117138
int u = x.getKey();
118139
double p = x.getValue();
119-
List<Integer> nxt = new ArrayList<>();
140+
int cnt = 0;
120141
for (int v : g[u]) {
121142
if (!vis[v]) {
122-
nxt.add(v);
123-
vis[v] = true;
143+
++cnt;
124144
}
125145
}
126-
if (u == target && (nxt.isEmpty() || t == 0)) {
127-
return p;
146+
if (u == target) {
147+
return cnt * t == 0 ? p : 0;
128148
}
129-
for (int v : nxt) {
130-
q.offer(new Pair<>(v, p / nxt.size()));
149+
for (int v : g[u]) {
150+
if (!vis[v]) {
151+
vis[v] = true;
152+
q.offer(new Pair<>(v, p / cnt));
153+
}
131154
}
132155
}
133-
--t;
134156
}
135157
return 0;
136158
}
@@ -149,28 +171,28 @@ public:
149171
g[u].push_back(v);
150172
g[v].push_back(u);
151173
}
152-
typedef pair<int, double> pid;
153-
queue<pid> q;
154-
q.push({1, 1.0});
155-
vector<bool> vis(n + 1);
174+
queue<pair<int, double>> q{{{1, 1.0}}};
175+
bool vis[n + 1];
176+
memset(vis, false, sizeof(vis));
156177
vis[1] = true;
157-
while (!q.empty() && t >= 0) {
178+
for (; q.size() && t >= 0; --t) {
158179
for (int k = q.size(); k; --k) {
159-
auto x = q.front();
180+
auto [u, p] = q.front();
160181
q.pop();
161-
int u = x.first;
162-
double p = x.second;
163-
vector<int> nxt;
182+
int cnt = 0;
183+
for (int v : g[u]) {
184+
cnt += !vis[v];
185+
}
186+
if (u == target) {
187+
return cnt * t == 0 ? p : 0;
188+
}
164189
for (int v : g[u]) {
165190
if (!vis[v]) {
166191
vis[v] = true;
167-
nxt.push_back(v);
192+
q.push({v, p / cnt});
168193
}
169194
}
170-
if (u == target && (t == 0 || nxt.empty())) return p;
171-
for (int v : nxt) q.push({v, p / nxt.size()});
172195
}
173-
--t;
174196
}
175197
return 0;
176198
}
@@ -180,46 +202,84 @@ public:
180202
### **Go**
181203
182204
```go
183-
type pid struct {
184-
x int
185-
p float64
186-
}
187-
188205
func frogPosition(n int, edges [][]int, t int, target int) float64 {
189206
g := make([][]int, n+1)
190207
for _, e := range edges {
191208
u, v := e[0], e[1]
192209
g[u] = append(g[u], v)
193210
g[v] = append(g[v], u)
194211
}
195-
q := []pid{pid{1, 1.0}}
212+
type pair struct {
213+
u int
214+
p float64
215+
}
216+
q := []pair{{1, 1}}
196217
vis := make([]bool, n+1)
197218
vis[1] = true
198-
for len(q) > 0 && t >= 0 {
219+
for ; len(q) > 0 && t >= 0; t-- {
199220
for k := len(q); k > 0; k-- {
200-
x := q[0]
221+
u, p := q[0].u, q[0].p
201222
q = q[1:]
202-
u, p := x.x, x.p
203-
var nxt []int
223+
cnt := 0
204224
for _, v := range g[u] {
205225
if !vis[v] {
206-
vis[v] = true
207-
nxt = append(nxt, v)
226+
cnt++
208227
}
209228
}
210-
if u == target && (len(nxt) == 0 || t == 0) {
211-
return p
229+
if u == target {
230+
if cnt*t == 0 {
231+
return p
232+
}
233+
return 0
212234
}
213-
for _, v := range nxt {
214-
q = append(q, pid{v, p / float64(len(nxt))})
235+
for _, v := range g[u] {
236+
if !vis[v] {
237+
vis[v] = true
238+
q = append(q, pair{v, p / float64(cnt)})
239+
}
215240
}
216241
}
217-
t--
218242
}
219243
return 0
220244
}
221245
```
222246

247+
### **TypeScript**
248+
249+
```ts
250+
function frogPosition(
251+
n: number,
252+
edges: number[][],
253+
t: number,
254+
target: number,
255+
): number {
256+
const g: number[][] = Array.from({ length: n + 1 }, () => []);
257+
for (const [u, v] of edges) {
258+
g[u].push(v);
259+
g[v].push(u);
260+
}
261+
const q: number[][] = [[1, 1]];
262+
const vis: boolean[] = Array.from({ length: n + 1 }, () => false);
263+
vis[1] = true;
264+
for (; q.length > 0 && t >= 0; --t) {
265+
for (let k = q.length; k > 0; --k) {
266+
const [u, p] = q.shift()!;
267+
const cnt = g[u].filter(v => !vis[v]).length;
268+
if (u === target) {
269+
return cnt * t === 0 ? p : 0;
270+
}
271+
for (const v of g[u]) {
272+
if (!vis[v]) {
273+
vis[v] = true;
274+
q.push([v, p / cnt]);
275+
}
276+
}
277+
}
278+
}
279+
return 0;
280+
}
281+
```
282+
223283
### **...**
224284

225285
```

0 commit comments

Comments
 (0)