LeetCode跳跃游戏

跳跃游戏|

题目

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。
在这里插入图片描述

题解| 贪心算法

对于每一个值来说,i + nums[i]是可以到达的最远位置,如果这个位置>=nums.size() - 1,那么就可以到达最远位置,设置一个maxstep遍历数组的时候去不断更新这个值。

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

题解||

专门用一个Jump容器,第一次遍历来记录每个点可以到达的最远值,第二次遍历判断这个值的大小。

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int Length=nums.size();
        vector<int> Jump(Length,0);
        for(int i=0;i<Length;i++)
            Jump[i]=i+nums[i];
        int index=0,MaxJump=Jump[0];
        for(;index<=MaxJump && index<Length;index++){
            if(Jump[index]>MaxJump)
                MaxJump=Jump[index];
        }
        if(MaxJump>=Length-1)
           return true;
        else
           return false;

    }
};

跳跃游戏 ||

题目

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

假设你总是可以到达数组的最后一个位置。

在这里插入图片描述
类似与上题解法,利用贪心不断更新最大可到达的距离,并及时更新curdistance,当i == curdistance时,说明已经到达了上次可达到的最远距离,进行更新curdistance

class Solution {
public:
    int jump(vector<int>& nums) {
        int res = 0;
        int n = nums.size();
        int curdistance = 0;
        int maxdistance = 0;
        for (int i = 0; i < n - 1; i++) {
            maxdistance = max(maxdistance, i + nums[i]);
            //如果当前跳的距离可以到达最后位置则跳一步可以退出循环
            if (maxdistance >= n - 1) {
                res++;
                break;
            }
        //如果到达上一次跳的最远的右边界
            if (i == curdistance) {
                curdistance = maxdistance;
                res++;
            }
        }
        return res;
   }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值