# 力扣55.跳跃游戏

92 阅读1分钟

题目

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

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

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

image.png

过程:
    一看到题目,果断采用了DFS来做,结果发现超出时间。后来仔细想了一下,采用DFS的时间复杂度好像高达O(n^n),额。。。。。。
    后来去看了一下题解,得到了一点启发,想出了自己的解决方法

思路:
①如果数组元素都不为0,那么一定可以跳到最后一个下标。如果下标i对应的元素为0,那么到达该位置后就停住了,无法跳跃了,所以不能跳到下标i的位置。所以整道题的要点就在于判断能不能跳过数组中所有的0
②假设数组中为0的元素的下标为index1,那么我们只需要在nums[index1]之前,找到一个元素nums[index2],使得nums[index2]>index1-index2,那么就一定可以跨过这个0;
nums[index2]>index1-index2 == nums[index2]+index2>index1 ,所以我们只需要找到index1之前,所有nums[index2]+index2的最大值max,使得max>index1即可。能找到则一定能跨过这个0,继续往下走,找不到则说明不能跨过这个0,返回false

来人呀!给朕上代码

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