解法一: DP
dp[i]代表走到i position后最多可以继续可以走到的position。
dp[i] = max(dp[i-1], i+nums[i]);
如果dp[i-1]>=i, 继续遍历。反之,return false。
class Solution {
public:
bool canJump(vector<int>& nums) {
int n = nums.size();
if(n<2) return true;
vector<int> dp(n, 0);
dp[0] = nums[0];
for(int i=1;i<n;i++){
if(dp[i-1]<i) return false;
dp[i] = max(i+nums[i], dp[i-1]);
}
return true;
}
};
解法二:Greedy
class Solution {
public:
bool canJump(vector<int>& nums) {
int n = nums.size(), reach = 0;
for (int i = 0; i < n; ++i) {
if (i > reach || reach >= n - 1) break;
reach = max(reach, i + nums[i]);
}
return reach >= n - 1;
}
};