Jump Game II 到达终点的最小步数 模拟

Jump Game 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.)

Hide Tags
  Array Greedy
class Solution {
public:
//用动态规划 超时了
/*
    int jump(vector<int>& nums) {
        
        int len=nums.size();
        int *dp=new int[len];
        const int MAX=9999999;
        dp[0]=0;
        
        for(int i=1;i<len;i++)
            dp[i]=MAX;
            
        for(int i=1;i<len;i++)
        {
            for(int j=0;j<i;j++)
            {
                if(j+nums[j]>=i)
                {
                    int tmp=dp[j]+1;
                    if(tmp<dp[i])
                    {
                        dp[i]=tmp;
                        break;
                    }
                }
            }
        }
        
        return dp[len-1];
    }
    
    
    //倒退也超时
    int jump(vector<int>& nums) {
    
        int n=nums.size();
        int pre=0,last=n-1;
        int sum=0;
        while(1)
        {
            if(pre==last)
                return 0;
            pre=last;//两个节点保存当前位置,pre向前遍历寻找满足的,last保存当前位置
            sum++;
            for(int i=n-2;i>=0;i--)
            {
                if(i+nums[i]>=last)
                {
                    if(pre>i)
                        pre=i;
                }
            }
            
            if(pre==0)
                return sum;
        };
    } 
    */   
    /*参考别人的:
    sum:目前为止的jump数
    cur:从A[0]进行sum次jump之后达到的最大范围,当前能到达的最大的
    curMax:从0~i这i+1个A元素中能达到的最大范围,就是当前该位置可以覆盖的最大范围
    当cur<i,说明sum次jump已经不足以覆盖(>=)当前第i个元素,因此需要增加一次jump,使之达到记录的curMax。
    A = [2,3,1,1,4]模拟即可
*/
    int jump(vector<int>& nums) {
    
        int cur=0,curMax=0,sum=0;
        int n=nums.size();
        for(int i=0;i<n;i++)
        {
            if(cur<i)
            {
                sum++;
                cur=curMax;
            }
            curMax=max(curMax,i+nums[i]);
        }
        return sum;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值