题目描述 :
给定一个非负整数数组 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;
}
本文介绍了两种方法解决数组跳跃游戏问题,一种是动态规划,通过维护当前位置剩余步数来判断是否能到达最后一个下标;另一种是贪心算法,每次更新能跳到的最远位置,如果在遍历过程中无法达到当前下标,说明不可达。这两种方法都是判断数组中每个元素代表的跳跃长度能否使我们成功到达最后一个下标。
419

被折叠的 条评论
为什么被折叠?



