题目描述 :
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
方法一:动态规划
dp[i] = max(dp[i-1,nums[i-1)-1;
记录当前位置还剩余几步
当剩余步数小于0,表示该下标不可达,直接return false
因为如果最后一个下标可达,那么数组中每一个下标可达。
bool canJump(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n,0);
dp[0] = 0;
for(int i=1;i<n;i++){
dp[i] = max(dp[i-1],nums[i-1])-1;
if(dp[i]<0) return false;
}
return dp[n-1]>=0;
}
方法二:
每次记录最远可以跳到哪个位置len
当len小于i,表明i不可达,return false
bool canJump(vector<int>& nums) {
int n = nums.size();
int len = 0;
for(int i=0;i<=len && i<n;i++){
len = max(len,i+nums[i]);
}
return len>=n-1;
}