← All problems

2770. Maximum Number of Jumps to Reach the Last Index

MediumOpen on LeetCodeProblem statement

Problem Statement

2770. Maximum Number of Jumps to Reach the Last Index

Medium


You are given a 0-indexed array nums of n integers and an integer target.

You are initially positioned at index 0. In one step, you can jump from index i to any index j such that:

Return the maximum number of jumps you can make to reach index n - 1.

If there is no way to reach index n - 1, return -1.

 

Example 1:

Input: nums = [1,3,6,4,1,2], target = 2
Output: 3
Explanation: To go from index 0 to index n - 1 with the maximum number of jumps, you can perform the following jumping sequence:
- Jump from index 0 to index 1. 
- Jump from index 1 to index 3.
- Jump from index 3 to index 5.
It can be proven that there is no other jumping sequence that goes from 0 to n - 1 with more than 3 jumps. Hence, the answer is 3. 

Example 2:

Input: nums = [1,3,6,4,1,2], target = 3
Output: 5
Explanation: To go from index 0 to index n - 1 with the maximum number of jumps, you can perform the following jumping sequence:
- Jump from index 0 to index 1.
- Jump from index 1 to index 2.
- Jump from index 2 to index 3.
- Jump from index 3 to index 4.
- Jump from index 4 to index 5.
It can be proven that there is no other jumping sequence that goes from 0 to n - 1 with more than 5 jumps. Hence, the answer is 5. 

Example 3:

Input: nums = [1,3,6,4,1,2], target = 0
Output: -1
Explanation: It can be proven that there is no jumping sequence that goes from 0 to n - 1. Hence, the answer is -1. 

 

Constraints:

Java

Source file
class Solution {
    public int maximumJumps(int[] nums, int target) {
        int n = nums.length;
        int[] memo = new int[n];
        Arrays.fill(memo, Integer.MIN_VALUE);
        memo[n - 1] = 0;
        dfs(nums, target, memo, 0);
        return memo[0] > 0 ? memo[0] : -1;
    }

    private int dfs(int[] nums, int target, int[] memo, int i) {
        if (memo[i] > Integer.MIN_VALUE)
            return memo[i];
        int maxJumps = Integer.MIN_VALUE;
        for (int j = i + 1; j < nums.length; j++) {
            if (Math.abs(nums[j] - nums[i]) <= target)
                maxJumps = Math.max(maxJumps, dfs(nums, target, memo, j) + 1);
        }
        // System.out.println(Arrays.toString(memo));
        return memo[i] = maxJumps;
    }
}