这是我参与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)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。