关闭

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

标签: leetcode oj
243人阅读 评论(0) 收藏 举报
分类:

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;
    }
};
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:356560次
    • 积分:11806
    • 等级:
    • 排名:第1258名
    • 原创:847篇
    • 转载:71篇
    • 译文:1篇
    • 评论:30条
    博客专栏