From b676f37ff21f09454a7e2fdadca347a3f5231f96 Mon Sep 17 00:00:00 2001 From: MaoLongLong <382084620@qq.com> Date: Thu, 29 Apr 2021 13:17:07 +0800 Subject: [PATCH] feat: add solutions to leetcode problem: No.0403. Frog Jump --- solution/0400-0499/0403.Frog Jump/README.md | 41 +++++++++++++++++-- .../0400-0499/0403.Frog Jump/README_EN.md | 40 +++++++++++++++++- .../0400-0499/0403.Frog Jump/Solution.java | 20 +++++++++ solution/0400-0499/0403.Frog Jump/Solution.py | 14 +++++++ 4 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 solution/0400-0499/0403.Frog Jump/Solution.java create mode 100644 solution/0400-0499/0403.Frog Jump/Solution.py diff --git a/solution/0400-0499/0403.Frog Jump/README.md b/solution/0400-0499/0403.Frog Jump/README.md index 90ce262bfa886..52e1faea792a0 100644 --- a/solution/0400-0499/0403.Frog Jump/README.md +++ b/solution/0400-0499/0403.Frog Jump/README.md @@ -40,11 +40,14 @@
  • stones[0] == 0
  • - ## 解法 +动态规划,用 `dp[i][k]` 表示最后一次跳跃为 `k` 个单位时,能否到达 `i` ,定义 base case 为 `dp[0][0] = True`(起点在下标 0)。 + +因为 “青蛙上一步跳跃了 `k` 个单位,那么它接下来的跳跃距离只能选择为 `k - 1`、`k` 或 `k + 1` 个单位”,所以 `dp[j][k - 1], dp[j][k], dp[j][k + 1]` 中有任一为真,即可从 `j` 跳跃到 `i`。 + ### **Python3** @@ -52,7 +55,20 @@ ```python - +class Solution: + def canCross(self, stones: List[int]) -> bool: + n = len(stones) + dp = [[False] * n for i in range(n)] + dp[0][0] = True + for i in range(1, n): + for j in range(i): + k = stones[i] - stones[j]; + if k > j + 1: + continue + dp[i][k] = dp[j][k - 1] or dp[j][k] or dp[j][k + 1] + if i == n - 1 and dp[i][k]: + return True + return False ``` ### **Java** @@ -60,7 +76,26 @@ ```java - +class Solution { + public boolean canCross(int[] stones) { + int n = stones.length; + boolean[][] dp = new boolean[n][n]; + dp[0][0] = true; + for (int i = 1; i < n; i++) { + for (int j = 0; j < i; j++) { + int k = stones[i] - stones[j]; + if (k > j + 1) { + continue; + } + dp[i][k] = dp[j][k - 1] || dp[j][k] || dp[j][k + 1]; + if (i == n - 1 && dp[i][k]) { + return true; + } + } + } + return false; + } +} ``` ### **...** diff --git a/solution/0400-0499/0403.Frog Jump/README_EN.md b/solution/0400-0499/0403.Frog Jump/README_EN.md index 6704d85d74715..84c5e67c9b301 100644 --- a/solution/0400-0499/0403.Frog Jump/README_EN.md +++ b/solution/0400-0499/0403.Frog Jump/README_EN.md @@ -39,18 +39,54 @@ ## Solutions +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). + +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`. + ### **Python3** ```python - +class Solution: + def canCross(self, stones: List[int]) -> bool: + n = len(stones) + dp = [[False] * n for i in range(n)] + dp[0][0] = True + for i in range(1, n): + for j in range(i): + k = stones[i] - stones[j]; + if k > j + 1: + continue + dp[i][k] = dp[j][k - 1] or dp[j][k] or dp[j][k + 1] + if i == n - 1 and dp[i][k]: + return True + return False ``` ### **Java** ```java - +class Solution { + public boolean canCross(int[] stones) { + int n = stones.length; + boolean[][] dp = new boolean[n][n]; + dp[0][0] = true; + for (int i = 1; i < n; i++) { + for (int j = 0; j < i; j++) { + int k = stones[i] - stones[j]; + if (k > j + 1) { + continue; + } + dp[i][k] = dp[j][k - 1] || dp[j][k] || dp[j][k + 1]; + if (i == n - 1 && dp[i][k]) { + return true; + } + } + } + return false; + } +} ``` ### **...** diff --git a/solution/0400-0499/0403.Frog Jump/Solution.java b/solution/0400-0499/0403.Frog Jump/Solution.java new file mode 100644 index 0000000000000..8ad3980b78302 --- /dev/null +++ b/solution/0400-0499/0403.Frog Jump/Solution.java @@ -0,0 +1,20 @@ +class Solution { + public boolean canCross(int[] stones) { + int n = stones.length; + boolean[][] dp = new boolean[n][n]; + dp[0][0] = true; + for (int i = 1; i < n; i++) { + for (int j = 0; j < i; j++) { + int k = stones[i] - stones[j]; + if (k > j + 1) { + continue; + } + dp[i][k] = dp[j][k - 1] || dp[j][k] || dp[j][k + 1]; + if (i == n - 1 && dp[i][k]) { + return true; + } + } + } + return false; + } +} diff --git a/solution/0400-0499/0403.Frog Jump/Solution.py b/solution/0400-0499/0403.Frog Jump/Solution.py new file mode 100644 index 0000000000000..22e11a5b89b67 --- /dev/null +++ b/solution/0400-0499/0403.Frog Jump/Solution.py @@ -0,0 +1,14 @@ +class Solution: + def canCross(self, stones: List[int]) -> bool: + n = len(stones) + dp = [[False] * n for i in range(n)] + dp[0][0] = True + for i in range(1, n): + for j in range(i): + k = stones[i] - stones[j]; + if k > j + 1: + continue + dp[i][k] = dp[j][k - 1] or dp[j][k] or dp[j][k + 1] + if i == n - 1 and dp[i][k]: + return True + return False