logo头像

学如逆水行舟,不进则退!!!

文章目录

给你一个起点你是否可以跳跃龙门

一、题目描述

跳跃游戏

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

示例 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

二、思路分析

image-20210525173037211

  • 我们首先在起点位置可以确定最大范围是从0~2这三块节点都是可达的。如果我们想通过起点不断的跳跃可以到达终点位置,那么就得在0~2这三个节点中不断将可达区间扩散。扩散的依据就是每个节点的可跳跃范围。从图中我们可知当在i=1时我们可以跳跃范围是3,那么就是1~4块节点都是可以跳跃达到的。
  • 不断扩散那么什么时候应该结束呢?一开始扩散肯定是起点不断扩散的,所以当我们最大范围超出数组范围了自然就是说明我们可以从起点通过不断跳跃到达终点
  • 因为后面节点未知性,所以我们需要将我们目前可达范围内的节点都进行尝试范围扩散。唯一的条件就是超出界限了就停止说明我们可以到达终点。否则就是无法到达终点

image-20210525174302941

  • 第一次扩散的边界

image-20210525174338568

  • 第二次扩散的边界

三、AC 代码

public boolean canJump(int[] nums) {
    int max = 0;
    for (int i = 0; i <= max; i++) {
        max = Math.max(max, i + nums[i]);
        if (max+1 >= nums.length) {
            return true;
        }
    }
    return false;
}

image-20210525174641771

  • 借助一个最大范围边界变量来控制是否可达的判断。 性能上算挺好的

四、总结

  • 此题和动态规划挺像的,但是仔细想想贪心算法更加符合。因为他只关心当前的可达范围。
  • 如果是动态规划的话,就会在后续中使用到之前的状态。而本题中不需要之前的状态,只需要判断当前想后续的操作。
  • 算法还需继续加深!

点赞环节哦

上一篇
坚持原创技术分享,您的支持将鼓励我继续创作!

评论系统未开启,无法评论!