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]i + j < nReturn the minimum number of jumps to reach nums[n - 1]. The test cases are generated such that you can reach nums[n - 1].
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.
Input: nums = [2,3,0,1,4]
Output: 2
Input: nums = [1,2,3]
Output: 2
1 <= nums.length <= 10^40 <= nums[i] <= 1000nums[n - 1]Greedy approach provides optimal solution!
The key is to think of the problem as selecting jump ranges rather than individual jumps.
Use a BFS-like greedy approach to track jump ranges.
Initialize:
jumps = 0 (number of jumps made)currentEnd = 0 (end of current jump range)farthest = 0 (farthest reachable position)For each position i from 0 to n-2:
farthest = max(farthest, i + nums[i])i == currentEnd (reached end of current range):
jumpscurrentEnd = farthest (start new range)Return jumps
farthest and make jumps when necessaryBottom-up DP approach (less efficient).
dp array: dp[i] = minimum jumps to reach index idp[0] = 0dp[i] = min(dp[i], dp[j] + 1)dp[n-1]This problem demonstrates: