55. 跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

题意:

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

难度:

中等

示例:

image.png

解析:

求路径是否可以抵达可以使用贪心算法 我们维持一个最远路径, 迭代器迭代节点时更新最远路径, 判断是否可达即可

55.drawio.png

这里要在迭代前判断该时代是否可达, 迭代器的迭代可不会自动判断节点是否可达

class Solution {

    public boolean canJump(int[] nums) {

        //最远位置, 最一开始是0

        int maxHeap = 0;

        //指向贪心节点的指针

        int pos = 0;

        //长度, 循环终止条件

        int length = nums.length;

        //极限情况

        if(length == 0 || length == 1){

            return true;

        }

        //迭代器

        for(; pos < length; ++pos){

            //拿节点

            int node = nums[pos];

            //判断节点是否可达

            if(maxHeap < pos){

                //该世代无法抵达

                return false;

            }

            //更新最远位置

            maxHeap = Math.max(maxHeap, nums[pos] + pos);

            //判断是否已经可以到达终点

            if(maxHeap >= length - 1){

                return true;

            }

        }

        //循环结束没有结果

        return false;

    }

}