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

原创 2015年07月07日 21:26:19

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;
    }
};
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

(hdu step 4.2.3)Knight Moves(求从起点是否能够到达终点的最小步数)

题目:Knight MovesTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total...

(hdu step 4.2.4)A strange lift(求从起点到终点的最小步数,限制条件是:在一维的情况下)

题目:A strange liftTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot...

[LeetCode]Jump Game II (贪心,维护当前最远能到达的位置和所需最少步数)

最少跳跃步数 第一想法是DP,复杂度O(n^2),但是对于大型数据会超时。 Discuss中一种犀利的贪心方法,复杂度为O(n) class Solution { public: int...

poj 1178 求所有棋子移动到相同位置的最小步数,

#include #include #include #include #define MIN(x,y) ((x)>(y)?(y):(x)) #define MAX(x,y) ((x)>(y)?(x)...
  • sky_zdk
  • sky_zdk
  • 2017年05月01日 21:10
  • 218

nyoj——58 最小步数(DFS,BFS 迷宫问题)

最少步数 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1...

bfs 较为全面的迷宫路径问题,包括路径的打印,起点到任一点的最小步数.

/*提供的输入数据: 输入行数列数 起点终点 然后输入任意点的位置,可求起点到终点的距离, 0 0 表示结束. input: 6 5 0 0 0 4 1 1 0 1 1 ...
  • ehi11
  • ehi11
  • 2012年07月21日 20:03
  • 1447

NYOJ 最小步数(简单深搜与广搜)

题目http://115.159.40.116/problem_show.php?pid=4670 二维地图最短路问题 广搜,这个题深搜也可以,先写个广搜吧#include #include #i...
  • zxy160
  • zxy160
  • 2016年12月27日 19:24
  • 338

最小步数

【问题描述】 在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋...

nyoj 58 最小步数

都是我写的,前后隔了很久...还好没有忘记bfs的基本思路 /*#include #include #include using namespace std; int map[9][9]={  {1,...

迷宫最小步数

|————————最少步数—————————|时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Jump Game II 到达终点的最小步数 模拟
举报原因:
原因补充:

(最多只允许输入30个字)