Greedy - Jump Game II
All diagrams presented herein are original creations, meticulously designed to enhance comprehension and recall. Crafting these aids required considerable effort, and I kindly request attribution if this content is reused elsewhere.
Difficulty : Easy
Greedy, 1D BST
Problem
You are given a 0-indexed array of integers nums
of length n
. You are initially positioned at nums[0]
.
Each element nums[i]
represents the maximum length of a forward jump from index i
. In other words, if you are at nums[i]
, you can jump to any nums[i + j]
where:
0 <= j <= nums[i]
andi + j < n
Return the minimum number of jumps to reach nums[n - 1]
. The test cases are generated such that you can reach nums[n - 1]
.
Example 1:
1
2
3
Input: nums = [2,3,1,1,4]
Output: 2
Explanation: The minimum number of jumps to reach the last index is 2. Jump 1 step from index 0 to 1, then 3 steps to the last index.
Example 2:
1
2
Input: nums = [2,3,0,1,4]
Output: 2
Solution
- This is similar to 1D BST solution as need to find farthest index based on current left and right pointer.
- Initially position left and right pointer to 0th index.
- Then move right pointer based on how far it can reach.
- Move the left pointer to 1+ current right pointer.
- For each boundary increase jump count by 1.
In the beginning both left
and right
will point to 0
th index as the initial window. We will also set number of jumps
needed to 0
1
2
left = right = 0
jumps = 0
Now we will have a while
loop until the right
pointer reaches end of the nums
array.
1
while right < len(nums) -1:
We need to keep finding how farthest
we could move in the current window. We would need a for
loop for this.
1
2
3
farthest = 0
for i in range(left,right+1):
farthest=max(farthest, i+nums[i])
Set left
pointer to the left of the new window.
1
left = right+1
Assign farthest
to right
.
1
right = farthest
Increment jumps
by 1
.
1
jumps+=1
Finally, return jumps.
1
return jumps
Final Code
Here is the full code.
1
2
3
4
5
6
7
8
9
10
11
12
13
def jumps(nums):
left = right = 0
jumps = 0
while right < len(nums) - 1:
fasthest = 0
for i in range(l, right+1):
fasthest = max(fasthest, i + nums[i])
left= right +1
right = fasthest
jumps+=1
return jumps