文章目录
- 题目描述
- 解题方法
- 模拟
- java代码
- 复杂度分析
- 相似题目
题目描述
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
示例 1:
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
提示:
- 1 <= nums.length <= 104
- 0 <= nums[i] <= 105
解题方法
模拟
这道题和第45题相似。我简单说一下思路。
我们记录当前可以跳跃到的最远位置maxPosition
,初始为0。我们从起点到maxPosition
之间开始遍历,设当前位置为i
。遍历过程中会出现以下几种情况。
- 若
i + nums[i] > maxPosition
,则更新maxPosition
; - 若
i + nums[i] >= nums.length - 1
,则返回true
; - 若从
i ~ maxPosition
遍历完成后,还没有到达nums
数组末尾,则返回false
。
根据以上情况就可以写代码了。
java代码
public boolean canJump(int[] nums) {// 记录当前可以跳跃到的最远位置int maxPosition = 0;// 从起点开始遍历,若当前位置 + 跳跃距离 > 当前可以跳跃到的最远位置,更新最远位置,直到当前位置 + 跳跃距离 >= 最后一个下标,返回truefor(int i = 0; i <= maxPosition; i++) {if(nums[i] + i >= nums.length - 1) {return true;}if(nums[i] + i > maxPosition) {maxPosition = nums[i] + i;}}// 此时当前可以跳跃到的最远位置 < 最后一个下标,返回falsereturn false;
}
复杂度分析
时间复杂度: O ( n ) O(n) O(n), n n n为数组长度,需要遍历一次数组。
空间复杂度: O ( 1 ) O(1) O(1),只有常数级别的变量存储。
相似题目
[leetcode] 45. 跳跃游戏 II
- 个人公众号
- 个人小游戏