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