202111-8更文-leetcode55:跳跃游戏

241 阅读2分钟

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

leetcode55:跳跃游戏

前文

本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。

题目信息

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

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

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

解题思路分析

解法1

本方案采用贪心算法。贪心算法的主要思路就是努力获取到能够跳跃到的最大长度。从某个节点的角度考虑,只要能够到达该节点,该节点上的数值为n,那么即可到达该节点x后的x+1,x+2...x+n节点。因此该思路就是从数组的首节点出发,不停的向后遍历。每到一个节点,便对该节点能够到达的最大节点进行记录。同时利用变量保存当前能够到达的最大节点。每个节点计算的最大节点与整体记录的最大节点进行比较,取其中较大值便为当前数组所能够到达的最大节点。这样当对数组经历了一轮遍历,即可能够得到数组所有元素根据逻辑所能够到达的最大节点。然后将该节点与数组的长度进行比较。如果最大节点大于等于数组的长度减1,即可判断出能够能够到达数组的末尾节点。反之,则不能。其实这里有一处可以进行优化,再计算数组的每个最大节点时,实时对于最大值进行比较运算。如果能够达到目标值,则可以提前将循环结束,减少遍历次数,实现优化。至此,题目解决完毕。

public boolean canJump(int[] nums) {
    int maxLength = 0;
    for (int i = 0; i < nums.length; i++) {
        if(nums[i] + i > maxLength && i <= maxLength){
            maxLength = nums[i] + i;
        }
    }
    return maxLength >= nums.length-1;
}

复杂度分析

  • 时间复杂度 o(n)
  • 空间复杂度 o(1)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。