leetcode 2770. 达到末尾下标所需的最大跳跃次数 中等

给你一个下标从 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
  • -10^9 <= nums[i] <= 10^9
  • 0 <= target <= 2 * 10^9

分析:定义 cnt[i] 表示从下标 0 跳到下标 i 时,最多可以跳跃的次数。如果某个位置当前无法到达,就将它的值设为 -1

初始时,起点下标 0 不需要跳跃即可到达,因此令 cnt[0] = 0。以 0 作为起点,从前往后枚举每一个位置 i,如果 cnt[i] != -1,说明当前位置可以到达。接着枚举它后面的所有位置 j,判断从 i 是否可以跳到 j。如果满足 nums[j] - nums[i][-target, target] 范围内,就说明可以从 i 跳到 j,此时可以用 cnt[i] + 1 更新 cnt[j]

因为题目要求的是"最多跳跃次数",所以每次更新时要取最大值:cntj = max(cnti + 1, cntj);

最终,cnt[n - 1] 就表示到达最后一个位置时的最大跳跃次数。如果最后一个位置无法到达,则结果为 -1。因为 nums 数组长度仅为 1000,所以不会超时,如果区间增大,需要用线段树优化区间操作。

cpp 复制代码
class Solution {
public:
    int maximumJumps(vector<int>& nums, int target) {
        int n=nums.size(),cnt[n+5];
        for(int i=0;i<n;++i)cnt[i]=-1;cnt[0]=0;
        for(int i=0;i<n;++i)
        {
            for(int j=i+1;j<n;++j)
            {
                if(cnt[i]!=-1&&nums[j]-nums[i]<=target&&nums[j]-nums[i]>=-1*target)
                    cnt[j]=max(cnt[i]+1,cnt[j]);
            }
        }
        int ret=cnt[n-1]==0?-1:cnt[n-1];
        return ret;
    }
};
相关推荐
YuK.W11 小时前
Leetcode100: 70.爬楼梯、118.杨辉三角、198.打家劫舍
java·算法·leetcode
旖-旎13 小时前
《LeetCode 64 最小路径和 || LeetCode 174 地下城游戏》
c++·算法·leetcode·动态规划
凯瑟琳.奥古斯特14 小时前
力扣1009补码解法C++实现
开发语言·c++·算法·leetcode·职场和发展
凯瑟琳.奥古斯特19 小时前
力扣1008:前序重建BST
开发语言·c++·算法·leetcode·职场和发展
aqiu11111120 小时前
【算法日记 13】LeetCode 49. 字母异位词分组:哈希表的进阶“降维打击”
算法·leetcode·散列表
人道领域1 天前
【LeetCode刷题日记】贪心算法理论与实战:455.分发饼干最优解
java·开发语言·数据结构·算法·leetcode·贪心算法
旖-旎2 天前
《LeetCode 746 使用最小花费爬楼梯 || LeetCode 91 解码方法》
c++·算法·leetcode·动态规划
wabs6662 天前
关于动态规划【力扣1035.不相交的线和53.最大子数组和的思考】
算法·leetcode·动态规划
退休倒计时2 天前
【每日一题】LeetCode 199. 二叉树的右视图 TypeScript
算法·leetcode·typescript
硕风和炜2 天前
【LeetCode: 1301. 最大得分的路径数目 + DP】
java·算法·leetcode·动态规划·dp·记忆化搜索