一,笨方法 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; }