23 力扣热题刷题记录之第55题跳跃游戏

系列文章目录

力扣热题刷题记录

前言

每天进步一点点!!

一、背景

解释一下题目,从下标0开始,你可以跳的最大长度为当前元素的值,问:可不可以跳到最后一个下标?
在这里插入图片描述

来源:力扣
链接:https://leetcode-cn.com/problems/jump-game/

二、我的思路

开始就想到的是递归,先跳最大步数,最大步数不行,那就减一步,可想而知,这样最大的复杂度就是每个数组元素相乘,肯定超时!!

但我还是依据我固有的办法,不管管不管用,先写下来,对,贴个代码:

class Solution {
public:
    bool flag=false;
    void panDuan(vector<int>& nums,int x)//x为当前下标
    {
        if (x<nums.size()-1 && nums[x]==0 )
        {
            flag=false;
            return;
        }
        if (x>=nums.size()-1)
        {
            flag=true;
            return;
        }
        for (int i=nums[x];i>0;i--)
        {
            if(flag==true)
                break;
            panDuan(nums,x+i);            
        }        
    }
    bool canJump(vector<int>& nums) {
        //初步使用递归来做
        //结束条件1:当前数组元素值为0
        //结束条件2:当前下标+数组元素值(>0)>=nums.size()-1
        panDuan(nums,0);
        return flag;
    }
};

最后是通过了75个用例呢,然后就超时了!!

三、官方的思路

1.贪心

怎么个贪心法呢,当前位置跳最大步数,不过他不是像我一样,用递归,一个个去试。

它是用一个max_arrive记录可到达的最远位置,如果到最后一个元素了,这个max——arrive都还么有达到最后一个下标,说明不可达,在访问每一个元素的时候,同时更新最大可到达位置。

代码如下:

class Solution {
public:

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

2.优化一下

代码如下:

class Solution {
public:

    bool canJump(vector<int>& nums) {
        int maxArrive=nums[0];
        for (int i=1; i<nums.size(); i++ )
        {
            if ( i > maxArrive)
            {
                return false;
            }
            maxArrive=max(maxArrive,i+nums[i]);

            //优化一下
            if (maxArrive>=nums.size()-1)
            {
                return true;
            }
        }
        return true;
    }
};

如果最大可到达的已经大于等于最大的下标,就无需进行遍历了!

优化情况:
在这里插入图片描述

总结

加油!不会做就不死磕,没必要,刷题嘛!!!

喜欢就点个赞叭!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值