美文网首页
【算法题】2770. 达到末尾下标所需的最大跳跃次数

【算法题】2770. 达到末尾下标所需的最大跳跃次数

作者: 程序员小2 | 来源:发表于2023-07-21 16:57 被阅读0次

题目:

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

java代码:

class Solution {
    // jump[i] 表示从下标 0 开始跳到 nums[i] 所需的最大跳跃次数
    int[] jump;

    public int maximumJumps(int[] nums, int target) {
        this.jump = new int[nums.length];
        Arrays.fill(jump, Integer.MIN_VALUE);
        jump[0] = 0;
        int maximumJumps = dfs(nums, nums.length - 1, target);
        return maximumJumps >= 0 ? maximumJumps : -1;
    }

    // 返回从下标 i 跳到下标 0 所需最大的跳跃次数
    private int dfs(int[] nums, int i, int target) {
        if (jump[i] != Integer.MIN_VALUE) {
            return jump[i];
        }

        int max = Integer.MIN_VALUE;
        for (int j = i - 1; j >= 0; j--) {
            int val = nums[j] - nums[i];
            if (-target <= val && val <= target) {
                int jump = dfs(nums, j, target) + 1;
                max = Math.max(max, jump);
            }
        }

        return jump[i] = max;
    }

}

相关文章

  • 【算法题】1654. 到家的最少跳跃次数

    题目: 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发,到达它的家。 跳蚤跳跃的规则如下: 它可...

  • 数据结构之---求最大字段和, 时间复杂度o(n)算法

    问题描述 采用动态规划策略设计并实现算法,求解最大子段和及最大子段和的起始下标和终止下标,要求算法的时间复杂性不超...

  • Android自定义可拓展TextView

    需求:1:可设置最大行数,达到最大行数后末尾显示…2:最大行数末尾的…之后显示提示展开的文案和图片,比如:“更多【...

  • 哲哲的ML笔记(七:学习率)

    代价函数-迭代次数 梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数和...

  • LeetCode 重构字符串

    一、解题思路 贪心算法 1、根据字母在字符串中出现的次数来决定新的位置。 2、通过维护两个参数:奇数下标、偶数下标...

  • 分布式组件-Sentinel-常见流量控制算法

    常见的限流算法 计数器(固定窗口)算法 在指定周期内累加访问次数,当访问次数达到设定的阈值时,触发限流策略,当进入...

  • 交换排序-快速排序

    时间复杂度:高效的排序算法,比较次数和移动次数都应该尽可能的少。 空间复杂度:算法执行期所需要辅助空间和待排序的数...

  • 交换排序-冒泡排序

    时间复杂度:高效的排序算法,比较次数和移动次数都应该尽可能的少。 空间复杂度:算法执行期所需要辅助空间和待排序的数...

  • 排序算法:计数排序O(n+m)

    核心思想 计数排序不是基于比较的排序算法,算法的核心有3点:统计原数组中每个元素出现的次数。以原数组中的元素为下标...

  • 121. Best Time to Buy and Sell S

    最大子段和问题的变形:此题相关的算法是:Kadane算法代码:

网友评论

      本文标题:【算法题】2770. 达到末尾下标所需的最大跳跃次数

      本文链接:https://www.haomeiwen.com/subject/oautpdtx.html