Leetcode 55. Jump Game

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

For example:
A = [2,3,1,1,4], return true.

A = [3,2,1,0,4], return false.

分析

由于每层最多可以跳{A[i]}步,也可以跳0或1步,因此如果能到达最高层,则说明每一层都可以到达。有了这个条件,说明可以用贪心法。

思路一:正向,从0出发,一层一层往上跳,看最后能不能超过最高层,能超过,说明能到达,否则不能到达。

思路二:逆向,从最高层下楼梯,一层一层下降,看最后能不能下降到第0层。

思路三:可以用动规,设状态为{f[i]},表示从第0层出发,走到走到{A[i]}时剩余的最大步数,则状态转移方程为:

                     f[i]=max(f[i1],A[i1])1,i>0

 写根据思路一写出代码:

1 // 思路1,时间复杂度O(n),空间复杂度O(1)
2 bool canJump(int* nums, int numsSize) {
3     int index = 0, i;
4     for(i = 0; i <= index && index < numsSize; i++){
5         index = index > i + nums[i] ? index : i + nums[i];
6     }
7     return index >= numsSize - 1;
8 }
 1 class Solution {
 2 public:
 3     bool canJump(vector<int>& nums) {
 4         int max_index = 0;
 5         int numsSize = nums.size();
 6         for(int i = 0; i <= max_index && max_index < numsSize; i++){
 7             max_index = max(max_index, i + nums[i]);
 8         }
 9         return max_index >= numsSize - 1;
10     }
11 };

思路二:

 1 // 思路2,时间复杂度O(n),空间复杂度O(1)
 2 bool canJump(int* nums, int numsSize){
 3     if(numsSize == 0)
 4         return true;
 5     int index = numsSize - 1, i;
 6     for(i = numsSize - 2; i >= 0; i--){
 7         if(i + nums[i] >= index)
 8             index = i;
 9     }
10     return index == 0;
11 }

思路三:

 1 // 思路三,动规,时间复杂度O(n),空间复杂度O(n)
 2 class Solution {
 3 public:
 4     bool canJump(vector<int>& nums) {
 5         int numsSize = nums.size();
 6         vector<int> f(numsSize, 0);
 7         for(int i = 1; i < numsSize; i++){
 8             f[i] = max(f[i - 1], nums[i - 1]) - 1;
 9             if(f[i] < 0)
10                 return false;
11         }
12         return f[numsSize - 1] >= 0;
13     }
14 };

 

posted @ 2016-08-28 22:43  琴影  阅读(146)  评论(0编辑  收藏  举报