Skip to content

Commit 5425aa2

Browse files
authored
feat: add solutions to leetcode problem: No.0403. Frog Jump (doocs#360)
1 parent 0e1dd5e commit 5425aa2

File tree

4 files changed

+110
-5
lines changed

4 files changed

+110
-5
lines changed

solution/0400-0499/0403.Frog Jump/README.md

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,27 +40,62 @@
4040
<li><code>stones[0] == 0</code></li>
4141
</ul>
4242

43-
4443
## 解法
4544

4645
<!-- 这里可写通用的实现逻辑 -->
4746

47+
动态规划,用 `dp[i][k]` 表示最后一次跳跃为 `k` 个单位时,能否到达 `i` ,定义 base case 为 `dp[0][0] = True`(起点在下标 0)。
48+
49+
因为 “青蛙上一步跳跃了 `k` 个单位,那么它接下来的跳跃距离只能选择为 `k - 1``k``k + 1` 个单位”,所以 `dp[j][k - 1], dp[j][k], dp[j][k + 1]` 中有任一为真,即可从 `j` 跳跃到 `i`
50+
4851
<!-- tabs:start -->
4952

5053
### **Python3**
5154

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

5457
```python
55-
58+
class Solution:
59+
def canCross(self, stones: List[int]) -> bool:
60+
n = len(stones)
61+
dp = [[False] * n for i in range(n)]
62+
dp[0][0] = True
63+
for i in range(1, n):
64+
for j in range(i):
65+
k = stones[i] - stones[j];
66+
if k > j + 1:
67+
continue
68+
dp[i][k] = dp[j][k - 1] or dp[j][k] or dp[j][k + 1]
69+
if i == n - 1 and dp[i][k]:
70+
return True
71+
return False
5672
```
5773

5874
### **Java**
5975

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

6278
```java
63-
79+
class Solution {
80+
public boolean canCross(int[] stones) {
81+
int n = stones.length;
82+
boolean[][] dp = new boolean[n][n];
83+
dp[0][0] = true;
84+
for (int i = 1; i < n; i++) {
85+
for (int j = 0; j < i; j++) {
86+
int k = stones[i] - stones[j];
87+
if (k > j + 1) {
88+
continue;
89+
}
90+
dp[i][k] = dp[j][k - 1] || dp[j][k] || dp[j][k + 1];
91+
if (i == n - 1 && dp[i][k]) {
92+
return true;
93+
}
94+
}
95+
}
96+
return false;
97+
}
98+
}
6499
```
65100

66101
### **...**

solution/0400-0499/0403.Frog Jump/README_EN.md

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,54 @@
3939

4040
## Solutions
4141

42+
DP, use `dp[i][k]` to indicate whether `i` can be reached when the last jump was `k` units, and define the base case as `dp[0][0] = True` (starting point is at index 0).
43+
44+
Because "the frog's last jump was `k` units, its next jump must be either `k - 1`, `k`, or `k + 1` units", so if any of `dp[j][k-1], dp[j][k], dp[j][k + 1]` is true, frog can jump from `j` to `i`.
45+
4246
<!-- tabs:start -->
4347

4448
### **Python3**
4549

4650
```python
47-
51+
class Solution:
52+
def canCross(self, stones: List[int]) -> bool:
53+
n = len(stones)
54+
dp = [[False] * n for i in range(n)]
55+
dp[0][0] = True
56+
for i in range(1, n):
57+
for j in range(i):
58+
k = stones[i] - stones[j];
59+
if k > j + 1:
60+
continue
61+
dp[i][k] = dp[j][k - 1] or dp[j][k] or dp[j][k + 1]
62+
if i == n - 1 and dp[i][k]:
63+
return True
64+
return False
4865
```
4966

5067
### **Java**
5168

5269
```java
53-
70+
class Solution {
71+
public boolean canCross(int[] stones) {
72+
int n = stones.length;
73+
boolean[][] dp = new boolean[n][n];
74+
dp[0][0] = true;
75+
for (int i = 1; i < n; i++) {
76+
for (int j = 0; j < i; j++) {
77+
int k = stones[i] - stones[j];
78+
if (k > j + 1) {
79+
continue;
80+
}
81+
dp[i][k] = dp[j][k - 1] || dp[j][k] || dp[j][k + 1];
82+
if (i == n - 1 && dp[i][k]) {
83+
return true;
84+
}
85+
}
86+
}
87+
return false;
88+
}
89+
}
5490
```
5591

5692
### **...**
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public boolean canCross(int[] stones) {
3+
int n = stones.length;
4+
boolean[][] dp = new boolean[n][n];
5+
dp[0][0] = true;
6+
for (int i = 1; i < n; i++) {
7+
for (int j = 0; j < i; j++) {
8+
int k = stones[i] - stones[j];
9+
if (k > j + 1) {
10+
continue;
11+
}
12+
dp[i][k] = dp[j][k - 1] || dp[j][k] || dp[j][k + 1];
13+
if (i == n - 1 && dp[i][k]) {
14+
return true;
15+
}
16+
}
17+
}
18+
return false;
19+
}
20+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def canCross(self, stones: List[int]) -> bool:
3+
n = len(stones)
4+
dp = [[False] * n for i in range(n)]
5+
dp[0][0] = True
6+
for i in range(1, n):
7+
for j in range(i):
8+
k = stones[i] - stones[j];
9+
if k > j + 1:
10+
continue
11+
dp[i][k] = dp[j][k - 1] or dp[j][k] or dp[j][k + 1]
12+
if i == n - 1 and dp[i][k]:
13+
return True
14+
return False

0 commit comments

Comments
 (0)