055 Jump Game[M]

1 题目描述

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.

难度:Medium

2 题目样例

For example:

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

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

3 题意分析

这题目和之前我曾经写过题解的Jump Game II属于同系列问题。和之前的那道题目比较,这道题目反而要更简单一点。只需要在最后判断一下是否可以到达终点即可。

(不了解题意的,可以查看045 Jump Game II[H]

4 思路分析

由于这个题目在题设上降低了要求,因此我们在思路上也可以降低一点要求。(由于之前在学校的上机考试中做过与之类似的题目,所以这次就直接使用当时的思路了)

观察样例,我们可以看出输出false的样例中,无论在前三个格子中的哪格,所能到达的最远格子也只是格子4而已(对应的value为0 ,意味着不能继续前进)。我们可以由此得到启发,来确定返回true和false的判定条件。

在整个前进的过程中,我可以一直收集格子上的数字,来尝试寻找可以走的最远的路径有多远,如果这个路径的长度已经超过了题目中给出路径的长度,那么就一定返回true,否则返回false。

我们可以将整个数组中的最后一格上的数字置为-1,然后采取如下的动态规划手段:

if(nums[i]>0)
      nums[i+1]=max(nums[i+1],nums[i]-1);            
else
      break;

以此来寻找最长的路径。

注意,其中有一种特殊的情况是只给出一个0,这种情况需要特判。

代码实现如下:

class Solution 

{
    
public:
    
    bool canJump(vector<int>& nums) 
    
    {
        int n=nums.size();
        
        if(n==1) return true;
        
        nums[n-1]=-1;
        
        for(int i=0;i<n-1;i++)
            
        {
            if(nums[i]>0)
            
            nums[i+1]=max(nums[i+1],nums[i]-1);
            
            else
                
            break;
        }
        
        if(nums[n-1]>=0) return true;
        
        else return false;
        
    }
    
};

看起来效率还不错。

《055 Jump Game[M]》
《055 Jump Game[M]》

5 后记

LeetCode的评测机有毒吧…两次评测之间的时间相差居然那么大??

    原文作者:Lolita
    原文地址: https://zhuanlan.zhihu.com/p/34811137
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞