Similar Problems
Similar Problems not available
Odd Even Jump - Leetcode Solution
LeetCode: Odd Even Jump Leetcode Solution
Difficulty: Hard
Topics: stack dynamic-programming array
The Odd Even Jump problem on LeetCode is a challenging problem that requires you to use a combination of data structures and algorithms to solve. In this problem, you are given an array of integers and you need to determine the number of indices you can jump to from each index such that the jump sequence follows the odd-even pattern.
The odd-even pattern means that from each index, you can jump to an odd index that has a value greater than or equal to the value at the current index or jump to an even index that has a value less than or equal to the value at the current index. You need to find the number of indices from which you can reach the last index following these pattern.
One approach to solving this problem is to use dynamic programming to store the possible next jumps for each index and then backtrack to find the answer. Specifically, we can create two arrays: minIdx and maxIdx, where minIdx[i] denotes the index of the smallest element that we can jump to from index i and maxIdx[i] denotes the index of the largest element that we can jump to from index i, both of which follow the odd-even pattern.
To fill out these arrays, we can use a TreeMap data structure to store the values and their corresponding indices. We can iterate through the array from right to left and for each index i, we can use the TreeMap to find the next minimum and maximum index that follows the odd-even pattern. If such indices exist, we set minIdx[i] and maxIdx[i] to these values. Otherwise, we set them to null.
Once we have constructed these two arrays, we can use another dynamic programming approach to count the number of indices that can reach the end following the odd-even pattern. We create two arrays: oddNum and evenNum. oddNum[i] denotes the number of indices that can jump to index i following the odd-even pattern starting from an odd-numbered jump. Similarly, evenNum[i] denotes the number of indices that can jump to index i following the odd-even pattern starting from an even-numbered jump.
We initialize the last element in both arrays to 1 since we can always reach the end from the last index. Then, we iterate through the array from right to left and for each index i, we update the oddNum and evenNum arrays as follows:
if minIdx[i] is not null, we add the value of evenNum[minIdx[i]] to oddNum[i] if maxIdx[i] is not null, we add the value of oddNum[maxIdx[i]] to evenNum[i]
Finally, we sum up all the values in the oddNum array since we only care about the odd-numbered jumps to reach the end.
Here is the implementation of the solution in Python:
from sortedcontainers import SortedDict
class Solution:
def oddEvenJumps(self, arr: List[int]) -> int:
n = len(arr)
minIdx, maxIdx = [None] * n, [None] * n
stack = []
values = SortedDict()
for i in range(n-1, -1, -1):
v = arr[i]
if v in values:
stack.append(i)
else:
while len(stack) > 0 and stack[-1] < i:
values.pop(arr[stack.pop()])
if len(stack) > 0:
minIdx[i] = stack[-1]
values[v] = i
stack = []
values = SortedDict()
for i in range(n-1, -1, -1):
v = arr[i]
if v in values:
stack.append(i)
else:
while len(stack) > 0 and stack[-1] < i:
values.pop(arr[stack.pop()])
if len(stack) > 0:
maxIdx[i] = stack[-1]
values[v] = i
oddNum, evenNum = [0] * n, [0] * n
oddNum[n-1], evenNum[n-1] = 1, 1
for i in range(n-2, -1, -1):
if minIdx[i] is not None:
oddNum[i] += evenNum[minIdx[i]]
if maxIdx[i] is not None:
evenNum[i] += oddNum[maxIdx[i]]
return sum(oddNum)
In this implementation, we use a SortedDict data structure from the sortedcontainers library to represent the TreeMap since it is more efficient than implementing it ourselves. The time complexity of this solution is O(n log n) due to the use of the TreeMap, which gives us O(log n) time complexity for each operation. The space complexity is also O(n) due to the use of the arrays to store the intermediate results.
Odd Even Jump Solution Code
1