Jump Game (Medium)

来源:互联网 发布:电子仿真软件列表 编辑:程序博客网 时间:2024/06/03 21:01

主要有两种思路:


一、

本题只需要判断能否到达最后一个数,那么可以采用贪心策略,到达某个位置i后,在直接在这个位置的基础上走nums[i]步,主要保证能一直前进,就能达到终点;

那么,什么时候才不能一直前进呢?

答案是,遇到0的时候,遇到nums[i]=0的时候,只要我们想办法跳过这个0,那么就可以确保我们可以继续前进。

所以遇到0时的处理方法是,往回搜索,设当前的位置为pos,即nums[pos]=0,一直搜索之前的数,判断nums[i]+i是否大于nums[pos],大于则可以继续上述的贪心算法,假如一直跳不过0(即搜索到i=0仍跳不过pos),则return false。

代码如下:

class Solution {public:    bool canJump(vector<int>& nums) {        if(nums.size()==1) return true;        int pos=0;        while(pos<nums.size()-1)        {            if(nums[pos]!=0)            {//走最远的位置                pos=nums[pos]+pos;            }            else            {//如果最远的位置为0                int now=pos;                for(int i=pos;i>=0;i--)                {//找到能跳过0的位置                    if(i+nums[i]>now)                     {                        pos=i+nums[i];                        break;                    }                }                if(pos==now)                 {//找不到跳过0,则false                    return false;                }            }        }        return true;    }};

二、

记录两个变量,一个是当前能达到的最远距离,另外一个是下一次能达到的最远距离。

O(n)的时间复杂度和O(1)的空间复杂度。

在到达当前最远距离前(包括当前最远距离),不断更新下一次能达到的最远距离。当到达了当前最远距离,除了更新nextMaxPos,还需要把currentMaxPos=nextMaxPos,nextMaxPos=0

下面为AC代码:

class Solution {public:    bool canJump(vector<int>& nums) {        if(nums.size()==1) return true;        int currentMaxPos=nums[0];        int nextMaxPos=0;        for(int i=0;i<nums.size();i++)        {            if(i<currentMaxPos)            {//更新下一次能达到的最远距离                nextMaxPos=max(nextMaxPos,i+nums[i]);                if(nextMaxPos>=nums.size()-1) return true;            }            else if(i==currentMaxPos)            {//达到当前最远的位置了,更新下一次能到达的最远距离,并且更新currentMaxPos和NextMaxPos                nextMaxPos=max(nextMaxPos,i+nums[i]);                if(nextMaxPos>=nums.size()-1) return true;                currentMaxPos=nextMaxPos;                nextMaxPos=0;                            }            else            {//更新当前能到的最远位置,把下一次能达到的最远距离清零                currentMaxPos=nextMaxPos;                nextMaxPos=0;            }        }        if(nextMaxPos>=nums.size()-1||currentMaxPos>=nums.size()-1) return true;        else return false;    }};


0 0
原创粉丝点击