55. 跳跃游戏
解题方法
题目说明数组中的每个元素代表你在该位置可以跳跃的最大长度意思就是当前下标到下标值加上该元素值之间的所有点都能跳跃,那么可以从第一个下标开始遍历,更新可以跳跃的最远距离lmax,将其与(i+nums[i])比较取更大的值,当lmax已经大于了nums的长度则返回true,而当lmax等于当前下标值则返回false,如果遍历完成后仍未达到最后一个下标返回false。(贪心、动态规划)
复杂度
时间复杂度:
空间复杂度:
Code
class Solution {
public:
bool canJump(vector<int>& nums) {
int len=nums.size(),lmax=0;
if(len==1) return true;
for(int i=0;i<len;++i){
lmax=lmax>i+nums[i]?lmax:i+nums[i];
if(lmax==i) return false;
if(lmax>=len-1) return true;
}
return false;
}
};
睿抗见()
题目
给你一个非负整数数组 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 <= 10^40 <= nums[i] <= 10^5