1. 055
2. 算法
http:\/\/www.acmerblog.com\/leetcode-solution-jump-game-6217.html
http:\/\/www.cnblogs.com\/grandyang\/p\/4371526.html
2.1 贪心算法:O(n)- 正向
正向,从0出发,一层一层网上跳,看最后能不能超过最高层,能超过,说明能到达,否则不能到达。
2.2 贪心算法:O(n):反向
- 逆向,从最高层下楼梯,一层一层下降,看最后能不能下降到第0层。
2.3 DP:O(n)
- 维护数组dp,dp[i]是走到i位置时,剩余的最大步数
- 递推:dp[i]=max(dp[i-1,A[i-1]])-1
- 若:dp[i]是负数,返回false
- 最后判断dp数组的最后一位是否是负数
3. 代码
3.1 正向贪心
class Solution{
public:
    bool canJump(vector<int>& nums){
        int n=nums.size();
        int reach=1; // 最右可以跳到哪里
        for(int i=0;i<reach && reach<n ;++i){
            reach=max(reach,i+1+nums[i]);
        }
        return  reach>=n;
    }
};
3.2 逆向贪心
class Solution {
public:
    bool canJump (int A[], int n) {
        if (n == 0) return true;
// 逆向下楼梯,最左能下降到第几层
        int left_most = n - 1;
        for (int i = n - 2; i >= 0; --i)
            if (i + A[i] >= left_most)
                left_most = i;
        return left_most == 0;
    }
};
3.3 DP
// LeetCode, Jump Game
// 思路三,动规,时间复杂度O(n),空间复杂度O(n)
class Solution{
public:
    bool canJump(vector<int>& nums) {
        int n=nums.size();
        vector<int> dp(n,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;
    }
};