45. Jump Game II(跳跃游戏II)

问题描述
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.
Your goal is to reach the last index in the minimum number of jumps.
For example:
Given array A = [2,3,1,1,4]
The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1, then 3 steps to the last index.)

问题分析
这个问题的要求很明确,给定一串数字,数字的值表示在这个位置可以直接到达的最大长度,我们要求的则是到达最后一个数字所需要的最小步数,问题看起来很简单,但是从数字开头到结尾可能有许多种不同的走法,我们怎么找出最短的那条路径呢?我们可以用一个变量step来记录我们所走的步数,但是step什么时候才要加1呢?我们可以采取这样的思维,我们可以定义i从0到最后一个下标,i是依次加1递增的,但是这其中必然有很多不必要走的步数,我们的step只在必须要走的步数才加1。我们可以定义lastable,currentable两个变量。lastable表示从上一个记录的位置可以到达的最大位置,如果i的值不大于该数值,则表示从last这个位置可以直接到达i的位置,step就不需要加1;如果i的值大于该数值,则表示从last到大不了该位置,这一步就是必须的,step就要加1。同时要更新laetble的值。而currentable记录当前位置可以到达的最大位置,用以更新lastable的值。

代码展示

#include <iostream>
#include <stdlib.h>
#include <vector>
using namespace std; 

class Solution {
public:
    int jump(vector<int>& nums){
        int lastable=0, currentable = 0, step =0;
        int n=nums.size();
        for(int i=0;i<n;i++){
            if(i>lastable){              //如果下标i超过了上一次最大可以到的的位置,则步数就要加1 
                step+=1;
                lastable = currentable;   //并且要重新定义上一步可以达到的最大位置 
            }
            int a= nums[i]+i;             //如果下标i没有超过上一次可以达到的最大位置,则代表这一位置可以有上一个记录的位置直接跳达 
            if(currentable<a){
                currentable = a;           //所以到这个位置步数可以省略,既不用加1 ,并且每次都要记录此位置可以到达的最大位置 
            }
        }
        return currentable >= n - 1 ? step : 0;    //如果最后可以到达,则返回所用步数。 
    }
};

int main(){
    int n;
    vector<int> nums;
    cout<<"输入容器的长度:";
    cin>>n;
    int num[n];
    for(int i = 0;i<n;i++){
        cin>>num[i];
        nums.push_back(num[i]);
    }
    Solution solution;
    int result=solution.jump(nums);
    cout<<result<<endl;
}

运行结果展示
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值