力扣题目
解题思路
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 , 所以永远不可能到达最后一个下标。
解题思路:
算法原理:
通过维护一个能到达的最右位置 rightmost
来判断是否能够从起点跳到终点。
思路:
遍历数组中的每个位置。对于当前位置 i
,如果它小于等于当前能到达的最右位置 rightmost
,则更新 rightmost
为其与从当前位置能跳的最远距离中的较大值。如果在更新过程中, rightmost
超过或等于数组的最后一个位置,说明可以跳到终点,返回 true
。如果遍历结束都没有出现这种情况,返回 false
。
代码分析:
- 在
canJump
方法中,首先获取数组长度n
并初始化rightmost
为 0 。 - 然后通过循环遍历数组。
- 在循环内,先进行条件判断,如果当前位置可及,就更新
rightmost
并检查是否能到达终点。
时间复杂度:O(n),其中 n
是数组 nums
的长度,需要遍历数组一次。
空间复杂度:O(1),只使用了固定的几个变量,空间开销恒定。
java代码:
package org.example;
public class Leetcode55 {
public static void main(String[] args) {
Leetcode55 leetcode55 = new Leetcode55();
System.out.println(leetcode55.canJump(new int[]{2,3,1,1,4}));
}
public boolean canJump(int[] nums) {
int n = nums.length;
int rightmost = 0;
for (int i = 0; i < n; ++i) {
if (i <= rightmost) {
rightmost = Math.max(rightmost, i + nums[i]);
if (rightmost >= n - 1) {
return true;
}
}
}
return false;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项