Skip to content

Commit 73bbc36

Browse files
add 403
1 parent dbf2b20 commit 73bbc36

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ Your ideas/fixes/algorithms are more than welcome!
180180
|406|[Queue Reconstruction by Height](https://leetcode.com/problems/queue-reconstruction-by-height/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_406.java)| O(nlogn)|O(1) | Medium| LinkedList, PriorityQueue
181181
|405|[Convert a Number to Hexadecimal](https://leetcode.com/problems/convert-a-number-to-hexadecimal/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_405.java)| O(n)|O(1) | Easy|
182182
|404|[Sum of Left Leaves](https://leetcode.com/problems/sum-of-left-leaves/)|[Solution](../master/src/main/java/com/fishercoder/solutions/SumofLeftLeaves.java)| O(n)|O(h) | Easy|
183+
|403|[Frog Jump](https://leetcode.com/problems/frog-jump/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_403.java)| O(n^2)|O(n^2) | Hard| DP
183184
|402|[Remove K Digits](https://leetcode.com/problems/remove-k-digits/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_402.java)| O(n)|O(n) | Medium| Greedy, Stack
184185
|401|[Binary Watch](https://leetcode.com/problems/binary-watch/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_401.java)| O(1)|O(1) | Easy|
185186
|400|[Nth Digit](https://leetcode.com/problems/nth-digit/)|[Solution](../master/src/main/java/com/fishercoder/solutions/_400.java)| O(n)|O(1) | Easy|
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.fishercoder.solutions;
2+
3+
import java.util.HashMap;
4+
import java.util.HashSet;
5+
import java.util.Map;
6+
import java.util.Set;
7+
8+
/**
9+
* 403. Frog Jump
10+
*
11+
* A frog is crossing a river.
12+
* The river is divided into x units and at each unit there may or may not exist a stone.
13+
* The frog can jump on a stone, but it must not jump into the water.
14+
15+
Given a list of stones' positions (in units) in sorted ascending order,
16+
determine if the frog is able to cross the river by landing on the last stone.
17+
Initially, the frog is on the first stone and assume the first jump must be 1 unit.
18+
19+
If the frog's last jump was k units, then its next jump must be either k - 1, k, or k + 1 units.
20+
Note that the frog can only jump in the forward direction.
21+
22+
Note:
23+
24+
The number of stones is ≥ 2 and is < 1,100.
25+
Each stone's position will be a non-negative integer < 231.
26+
The first stone's position is always 0.
27+
28+
Example 1:
29+
30+
[0,1,3,5,6,8,12,17]
31+
32+
There are a total of 8 stones.
33+
The first stone at the 0th unit, second stone at the 1st unit,
34+
third stone at the 3rd unit, and so on...
35+
The last stone at the 17th unit.
36+
37+
Return true. The frog can jump to the last stone by jumping
38+
1 unit to the 2nd stone, then 2 units to the 3rd stone, then
39+
2 units to the 4th stone, then 3 units to the 6th stone,
40+
4 units to the 7th stone, and 5 units to the 8th stone.
41+
42+
43+
Example 2:
44+
45+
[0,1,2,3,4,8,9,11]
46+
47+
Return false. There is no way to jump to the last stone as
48+
the gap between the 5th and 6th stone is too large.
49+
50+
*/
51+
public class _403 {
52+
53+
/**Reference: https://discuss.leetcode.com/topic/59903/very-easy-to-understand-java-solution-with-explanations/2
54+
* and https://leetcode.com/articles/frog-jump/#approach-5-using-dynamic-programmingaccepted*/
55+
public boolean canCross(int[] stones) {
56+
if (stones.length == 0) return true;
57+
Map<Integer, Set<Integer>> map = new HashMap<>(stones.length);
58+
map.put(0, new HashSet<>());
59+
map.get(0).add(1);
60+
for (int i = 1; i < stones.length; i++) {
61+
map.put(stones[i], new HashSet<>());
62+
}
63+
64+
for (int i = 0; i < stones.length; i++) {
65+
int stone = stones[i];
66+
for (int step : map.get(stone)) {
67+
int reach = step + stone;
68+
if (reach == stones[stones.length-1]) return true;
69+
Set<Integer> set = map.get(reach);
70+
if (set != null) {
71+
set.add(step);
72+
if (step - 1 > 0) {
73+
set.add(step - 1);
74+
}
75+
set.add(step + 1);
76+
}
77+
}
78+
}
79+
return false;
80+
}
81+
82+
}

0 commit comments

Comments
 (0)