Table of Contents
Problem Statement
Minimum Sideway Jumps LeetCode Solution – There is a 3 lane road of length n that consists of n + 1 points labeled from 0 to n. A frog starts at point 0 in the second lane and wants to jump to point n. However, there could be obstacles along the way.
You are given an array obstacles of length n + 1 where each obstacles[i] (ranging from 0 to 3) describes an obstacle on the lane obstacles[i] at the point i. If obstacles[i] == 0, there are no obstacles at the point i. There will be at most one obstacle in the 3 lanes at each point.
- For example, if
obstacles[2] == 1, then there is an obstacle in lane 1 at point 2.
The frog can only travel from point i to point i + 1 on the same lane if there is not an obstacle on the lane at the point i + 1. To avoid obstacles, the frog can also perform a side jump to jump to another lane (even if they are not adjacent) at the same point if there is no obstacle in the new lane.
- For example, the frog can jump from lane 3 at point 3 to lane 1 at point 3.
Return the minimum number of side jumps the frog needs to reach any lane at point n starting from lane 2 at point 0.
Note: There will be no obstacles on points 0 and n.

Input: obstacles = [0,1,2,3,0] Output: 2 Explanation: The optimal solution is shown by the arrows above. There are 2 side jumps (red arrows). Note that the frog can jump over obstacles only when making side jumps (as shown at point 2).
Explanation
dp[0] = minimum jump to reach lane 1
dp[1] = minimum jump to reach lane 2
dp[2] = minimum jump to reach lane 3
If meet a stone, set its dp[i] to infinity.
result equals to min(dp)
Code
C++ Code For Minimum Sideway Jumps
class Solution {
public:
int minSideJumps(vector<int>& A) {
int dp[] = {1, 0, 1};
for (int a: A) {
if (a > 0)
dp[a - 1] = 1e6;
for (int i = 0; i < 3; ++i)
if (a != i + 1)
dp[i] = min(dp[i], min(dp[(i + 1) % 3], dp[(i + 2) % 3]) + 1);
}
return min(dp[0], min(dp[1], dp[2]));
}
};Java Code For Minimum Sideway Jumps
class Solution {
public int minSideJumps(int[] A) {
int[] dp = new int[]{1, 0, 1};
for (int a: A) {
if (a > 0)
dp[a - 1] = 1000000;
for (int i = 0; i < 3; ++i)
if (a != i + 1)
dp[i] = Math.min(dp[i], Math.min(dp[(i + 1) % 3], dp[(i + 2) % 3]) + 1);
}
return Math.min(dp[0], Math.min(dp[1], dp[2]));
}
}Python Code For Minimum Sideway Jumps
class Solution:
def minSideJumps(self, A):
dp = [1, 0, 1]
for a in A:
if a:
dp[a - 1] = float('inf')
for i in range(3):
if a != i + 1:
dp[i] = min(dp[i], dp[(i + 1) % 3] + 1, dp[(i + 2) % 3] + 1)
return min(dp)
Complexity Analysis for Minimum Sideway Jumps LeetCode Solution
Time Complexity
O(N)
Space Complexity
O(1)