202111-9更文-leetcode45:跳跃游戏2

148 阅读2分钟

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

leetcode45:跳跃游戏2

前文

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

题目内容分析

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

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

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

假设你总是可以到达数组的最后一个位置。

解题思路分析

解法1

本解法主要采用数组的循环进行操作。首先对数组进行循环,当循环到每个数组位置时,再进行一次循环,也就是得到该位置能够到达的所有位置的可能性。同时,利用额外的一个数组保存每个位置的最小跳跃步数,将其初始值默认为Integer类型的上限值。跳跃到每个步数时进行一次额外的比较,也就是出发点的最小步数加1,和目标点当前保存的最小步数进行比较,取其中较小的值作为该目标点的当前最小值。外层循环到达的每个点都要进行同样的操作,以此来确定对于每个点的最小值的正确性。经过双层循环,即可通过数组得到每个点的最小值,可以认为是动态规划的dp数组。此时,获得目标结果,只需要直接将目标位置传入数组中,并从数组获取对应位置值即可,也就是目标值。该题的核心思想为动态规划的思路。至此,解题完毕。

public int jump(int[] nums) {
    if(nums.length == 0){
        return 1;
    }
    int[] count = new int[nums.length];
    for (int i = 1; i < count.length; i++) {
        count[i] = Integer.MAX_VALUE;
    }
    count[0] = 0;
    for (int i = 0; i < nums.length; i++) {
        for (int j = 0; j < nums[i]; j++) {
            if(i + j + 1 <= nums.length - 1){
                count[i + j + 1] = Math.min(count[i] + 1,count[i + j + 1]);
            }
        }
    }
    return count[count.length - 1];
}

复杂度分析

  • 时间复杂度 o(n^2)
  • 空间复杂度 o(n)

后记

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