[Java恶补day53] 45. 跳跃游戏Ⅱ

给定一个长度为 n 的 0 索引整数数组 nums。初始位置在下标 0。

每个元素 numsi 表示从索引 i 向后跳转的最大长度。换句话说,如果你在索引 i 处,你可以跳转到任意 (i + j) 处:

0 <= j <= numsi

i + j < n

返回到达 n - 1 的最小跳跃次数。测试用例保证可以到达 n - 1。

示例 1:

输入: nums = 2,3,1,1,4

输出: 2

解释: 跳到最后一个位置的最小跳跃数是 2。

从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:

输入: nums = 2,3,0,1,4

输出: 2

提示:

1 <= nums.length <= 1 0 4 10^4 104

0 <= numsi <= 1000

题目保证可以到达 n - 1


知识点:

贪心、数组、动态规划


解:

核心思路:

  1. 把区间i, i+nums\[i]视为一座桥
  2. 初始只能建一座0, 0+nums\[0]的桥
  3. 在可选的桥(可移动的区间)中,选择右端点最大的桥(跳的最远的位置)
  4. 重复该过程,直至右端点到达倒数第二个点(因为此时要么已经到达终点,要么还需要建造一座n-2, n-1的桥

对于测试样例1:2,3,1,1,4

时间复杂度: O ( n ) O(n) O(n)。

空间复杂度: O ( 1 ) O(1) O(1)。

java 复制代码
class Solution {
    public int jump(int[] nums) {
        //初始化当前可移动的左端点、右端点
        int curL = 0, curR = 0, res = 0;
        //遍历每个下标
        while (curR < nums.length - 1) {
            //获取当前的左右端点
            int l = curL, r = curR;
            //遍历可移动的区间
            for (int i = l; i <= r; i++) {
                if (i + nums[i] > curR) {
                    // 更新可移动区间的左右端点
                    curR = i + nums[i];
                    curL = i;
                }
            }
            //更新步数
            res++;
        }
        return res;
    }
}

参考:

1、灵神题解

相关推荐
Tisfy22 分钟前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
乐迪信息1 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
zww89491111 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设3 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳3 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊3 小时前
归并排序之翻转对(hard)
数据结构·算法
白山编程大哥3 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
devpotato3 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
shehuiyuelaiyuehao3 小时前
算法34,位运算符操作,总结
算法
xcl09254 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·spring boot·需求分析