一,笨方法  o(n^2)。果然看完别人的解法就自惭形秽啊!!

我用的动态规划方法。

比如输入

i:    0  1  2  3  4

————————————————

a[i]:   2  3  1  0  4

直接利用原来的数组计算。

a[i]>0 表示从a[i]出发可以达到终点,否则a[i] = 0。

首先,a[4]无论是多少,都能到4,因为到了4就不用走了。a[4] = 1;

现在看a[3] = 0,a[3] 只能在原地,所以a[3] = 0.

看a[2] = 1,那么看看 a[2 + 1]是否能到终点,如果可以a[2] =1,否则a[2] = 0.

看a[1] = 3,那么看看a[1+1],a[1+2],a[1+3]这三个数,是否有一个为1就可以了。 

最终结果:

如果a[0] > 0,OK。否则false。

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n = nums.size();
        vector<int> &a = nums;
        int i,j;
        
        a[n-1] = 1;
        
        for(i = n-2; i>=0; i--)
        {
            for( j = 1; j <= a[i]; j ++)
            {
                if(a[i+j] > 0)
                {
                    break;
                }
            }
            if(j > a[i])
            {
                a[i] = 0;
            }
        }
        return a[0] > 0;
    }
};

 

二、高手的解法。厉害啊。

用max来记录能到达的最右侧的位置。初始max = 0。因为只能在第0个位置。

遍历每一个能到达的位置,然后不断更新max。

最后检测,max是否到达了n-1.

bool canJump(vector<int>& nums) {
        int n = nums.size();
        vector<int> &a = nums;
        int i;
        
        int max_reach = 0;  //表示能达到的最大值
        
        for(i = 0; i<= max_reach; i++)
        {
            max_reach = max(max_reach, a[i] + i);   //i 可以偏移 a[i]个单位。最大就是i + a[i]
            if(max_reach >= n-1)    return true;
        }
        
        return false;
    }

 

posted on 2017-12-11 11:50  newbird2017  阅读(157)  评论(0编辑  收藏  举报