Jump Game

题目描述:

给定一个非负的整数数组,起点为数组的第一个位置,每一个数组元素的值表示从该位置能向前跳的最大值,判断能否到达该数组的最后一个位置。例如:A = [2,3,1,1,4], 从第一个位置开始该数为2向前跳2,到达第三个位置,该数为1向前跳1,到达第四个位置,该数为1向前跳1,到达最后一个位置,所以返回true。A = [3,2,1,0,4],从一个位置开始,该数为3向前跳3,到达第四个位置,该数为0无法向前跳,再从第二个位置开始,同理最后也只能到第四个位置,所以返回false。

分析:当nums[i]==0&&sum<i+1时,其中i表示当前位置,sum表示最大到达的位置,此时就像上述例子,只能停留在第四个位置。每次当nums[i]+i>sum,且nums[i]不为0时,我们都要更新sum值,sum=nums[i]+i。具体代码如下:

 1 bool canJump(vector<int>& nums) {
 2         int n=nums.size(),sum=0;
 3         if(n<=1) return true;
 4         for(int i=0;i<n-1;i++)
 5         {
 6             if(nums[i]==0&&sum<i+1) return false;
 7             if(nums[i]+i>sum&&nums[i]>0)
 8             {
 9                 sum=nums[i]+i;
10                 if(sum>=n-1) return true;
11             }
12         }
13         return false;
14     }

在上题的基础上,我们要求求出到达最后一个位置所跳最少的步数。例如A = [2,3,1,1,4],从第一个位置跳到第二的位置,然后可以直接跳到最后一个位置,最少步数为2.

分析:我们用一个变量count记录跳跃的步数,用变量last和cur分别记录上一次跳跃的最远距离和当前一次跳跃的最远距离,在循环遍历时,只有在i等于last记录数时,count才加1,当cur记录数大于等于数组最后一个位置时,返回count+1,当无法达到最后一个位置时返回-1.

 1 int jump(vector<int>& nums) {
 2          int step_count = 0;
 3          int last_jump_max = 0;
 4          int current_jump_max = 0;
 5          int length = nums.size();
 6          if (length <= 1) return 0;
 7          for (int i = 0; i<length; i++)
 8          {
 9            current_jump_max = max(current_jump_max, i + nums[i]);    
10            if (current_jump_max >= length - 1)
11                 return step_count+1;
12            else
13            {
14             if (i == last_jump_max)
15             {
16                 step_count++;
17                 last_jump_max = current_jump_max;
18             }
19            }
20          }
21          return -1;
22     }
原文地址:https://www.cnblogs.com/zhulong890816/p/4644117.html