LeetCode 题解工作台

达到末尾下标所需的最大跳跃次数

给你一个下标从 0 开始、由 n 个整数组成的数组 nums 和一个整数 target 。 你的初始位置在下标 0 。在一步操作中,你可以从下标 i 跳跃到任意满足下述条件的下标 j : 0 -target 返回到达下标 n - 1 处所需的 最大跳跃次数 。 如果无法到达下标 n - 1 ,返回 …

category

2

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

中等 · 状态·转移·动态规划

bolt

答案摘要

对于每个位置 ,我们考虑向后搜索能跳到的位置 ,如果满足 $|nums[i] - nums[j]| \leq target$,那么我们就可以从 跳到 ,并且从 开始继续向后搜索。 因此,我们设计一个函数 ,表示从位置 开始跳跃到末尾下标所需的最大跳跃次数。那么答案就是 。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个下标从 0 开始、由 n 个整数组成的数组 nums 和一个整数 target

你的初始位置在下标 0 。在一步操作中,你可以从下标 i 跳跃到任意满足下述条件的下标 j

  • 0 <= i < j < n
  • -target <= nums[j] - nums[i] <= target

返回到达下标 n - 1 处所需的 最大跳跃次数

如果无法到达下标 n - 1 ,返回 -1

 

示例 1:

输入:nums = [1,3,6,4,1,2], target = 2
输出:3
解释:要想以最大跳跃次数从下标 0 到下标 n - 1 ,可以按下述跳跃序列执行操作:
- 从下标 0 跳跃到下标 1 。 
- 从下标 1 跳跃到下标 3 。 
- 从下标 3 跳跃到下标 5 。 
可以证明,从 0 到 n - 1 的所有方案中,不存在比 3 步更长的跳跃序列。因此,答案是 3 。 

示例 2:

输入:nums = [1,3,6,4,1,2], target = 3
输出:5
解释:要想以最大跳跃次数从下标 0 到下标 n - 1 ,可以按下述跳跃序列执行操作:
- 从下标 0 跳跃到下标 1 。 
- 从下标 1 跳跃到下标 2 。 
- 从下标 2 跳跃到下标 3 。 
- 从下标 3 跳跃到下标 4 。 
- 从下标 4 跳跃到下标 5 。 
可以证明,从 0 到 n - 1 的所有方案中,不存在比 5 步更长的跳跃序列。因此,答案是 5 。 

示例 3:

输入:nums = [1,3,6,4,1,2], target = 0
输出:-1
解释:可以证明不存在从 0 到 n - 1 的跳跃序列。因此,答案是 -1 。 

 

提示:

  • 2 <= nums.length == n <= 1000
  • -109 <= nums[i] <= 109
  • 0 <= target <= 2 * 109
lightbulb

解题思路

方法一:记忆化搜索

对于每个位置 ii,我们考虑向后搜索能跳到的位置 jj,如果满足 nums[i]nums[j]target|nums[i] - nums[j]| \leq target,那么我们就可以从 ii 跳到 jj,并且从 jj 开始继续向后搜索。

因此,我们设计一个函数 dfs(i)dfs(i),表示从位置 ii 开始跳跃到末尾下标所需的最大跳跃次数。那么答案就是 dfs(0)dfs(0)

函数 dfs(i)dfs(i) 的计算过程如下:

  • 如果 i=n1i = n - 1,那么我们已经到达了末尾下标,不需要跳跃,因此返回 00
  • 否则,我们需要枚举从位置 ii 开始能跳到的位置 jj,并计算从 jj 开始跳跃到末尾下标所需的最大跳跃次数,那么 dfs(i)dfs(i) 就等于所有 dfs(j)dfs(j) 中的最大值加 11。如果不存在从 ii 开始能跳到的位置 jj,那么 dfs(i)=dfs(i) = -\infty

为了避免重复计算,我们可以使用记忆化搜索。

时间复杂度 O(n2)O(n^2),空间复杂度 O(n)O(n)。其中 nn 是数组的长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution:
    def maximumJumps(self, nums: List[int], target: int) -> int:
        @cache
        def dfs(i: int) -> int:
            if i == n - 1:
                return 0
            ans = -inf
            for j in range(i + 1, n):
                if abs(nums[i] - nums[j]) <= target:
                    ans = max(ans, 1 + dfs(j))
            return ans

        n = len(nums)
        ans = dfs(0)
        return -1 if ans < 0 else ans
speed

复杂度分析

指标
时间complexity is O(n^2) due to nested iteration over indices for state transitions. Space complexity is O(n) for the DP array storing maximum jumps at each index.
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Checks if candidate recognizes state transition DP as core pattern.

  • question_mark

    Looks for clear handling of unreachable indices with -1 in DP.

  • question_mark

    Wants candidate to justify why nested iteration captures maximum jumps correctly.

warning

常见陷阱

外企场景
  • error

    Failing to consider that some indices may never be reachable, leaving -1 incorrectly.

  • error

    Using greedy jumps instead of DP, which can miss maximum jump sequences.

  • error

    Forgetting to check abs(nums[i] - nums[j]) <= target for all valid previous indices.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Compute minimum jumps to reach last index instead of maximum.

  • arrow_right_alt

    Allow jumps in both directions, not just forward, with target constraint.

  • arrow_right_alt

    Optimize for large n by using segment trees or monotonic queues for DP transitions.

help

常见问题

外企场景

达到末尾下标所需的最大跳跃次数题解:状态·转移·动态规划 | LeetCode #2770 中等