Jump Game

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.

Determine if you are able to reach the last index.

For example:
A = [2,3,1,1,4], return true.

A = [3,2,1,0,4], return false.

 

算法1:暴力解法,注意A[0] = 0的边界条件.该解法O(n^2),大数据超时了

class Solution {
public:
bool canJump(int A[], int n) {
if(n == 1)return true;
else if(A[0] == 0)return false;
bool canArrive[n];
memset(canArrive, 0, sizeof(canArrive));
canArrive[0] = true;
for(int i = 0; i < n; i++)
{
if(canArrive[i] == false)continue;
int farest = min(i + A[i], n - 1);
for(int j = i + 1; j <= farest; j++)
canArrive[j] = true;
if(canArrive[n-1])return true;
}
return canArrive[n-1];
}
};

 

算法2:优化解法,只需要顺序扫描数组,记录下能够到达的最远位置

class Solution {
public:
bool canJump(int A[], int n) {
int canArrive = 0;//当前能到达的最远位置
for(int i = 0; i <= canArrive && canArrive < n-1; i++)
if(i + A[i] > canArrive)canArrive = i + A[i];
return canArrive >= n-1;
}
};

 


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

 

算法3:在上述算法1的基础上(其实是动态规划,minjumps[i] = min{minjumps[k] + 1},k<i 且 i+A[k]>=i )                            本文地址

class Solution {
public:
int jump(int A[], int n) {
vector<int> minjumps(n, INT_MAX);
minjumps[0] = 0;
for(int i = 0; i < n; i++)
{
int farest = min(i + A[i], n - 1);
for(int j = i + 1; j <= farest; j++)
if(minjumps[j] > minjumps[i] + 1)
minjumps[j] = minjumps[i] + 1;
}
return minjumps[n-1];
}
};

 

算法4:在上述算法2的基础上(具体解释可参考http://www.cnblogs.com/lichen782/p/leetcode_Jump_Game_II.html

class Solution {
public:
int jump(int A[], int n) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int canArrive = 0, res = 0, lastCanArrive = 0;
for(int i = 0; i < n; i++)
{
if(i > lastCanArrive)
{
res++;
lastCanArrive = canArrive;
}
if(i + A[i] > canArrive)
canArrive = i + A[i];
}
return res;
}
};

 

稍微改进一下,只要canArrive >= n-1 ,就可以结束循环,此时返回值是res+1

class Solution {
public:
int jump(int A[], int n) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if(n == 1)return 0;
int canArrive = 0, res = 0, lastCanArrive = 0;
for(int i = 0; canArrive < n-1; i++)
if(i + A[i] > canArrive)
{
if(i > lastCanArrive)
{
res++;
lastCanArrive = canArrive;
}
canArrive = i + A[i];
}
return res+1;
}
};

 

算法5:从最后一个开始,找到第一个能到最后的,再往前找第一个能到新的位置的,直到第0位(参考http://www.laurashawn.net/?p=10885

class Solution {
public:
int jump(int A[], int n) {
int i=n-1;
int step=0;
while(i>0){
for(int j=0;j<i;j++){
if(A[j]+j>=i){
step++;
i=j;
break;
}
}
}
return step;
}
};

 

 

【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3719630.html

LeetCode:Jump Game I II的更多相关文章

  1. leetcode Jump Game I II 待续 贪心看不懂啊!!!!

    下面是这两个题的解法: 参考博客:http://blog.csdn.net/loverooney/article/details/38455475 自己写的第一题(TLE): #include< ...

  2. LeetCode Single Number I / II / III

    [1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...

  3. [array] leetcode - 40. Combination Sum II - Medium

    leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...

  4. LeetCode 137. Single Number II(只出现一次的数字 II)

    LeetCode 137. Single Number II(只出现一次的数字 II)

  5. LeetCode:路径总和II【113】

    LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...

  6. LeetCode:组合总数II【40】

    LeetCode:组合总数II[40] 题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candi ...

  7. LeetCode: Jump Game II 解题报告

    Jump Game II Given an array of non-negative integers, you are initially positioned at the first inde ...

  8. [LeetCode] Jump Game II 跳跃游戏之二

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  9. 【leetcode】Jump Game I & II (hard)

    Jump Game (middle) Given an array of non-negative integers, you are initially positioned at the firs ...

随机推荐

  1. Spring-2-J Goblin Wars(SPOJ AMR11J)解题报告及测试数据

    Goblin Wars Time Limit:432MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Th ...

  2. [转]个人源码管理:如何在本机配置自己的SVN Repository (图解)

    本文转自:http://blog.csdn.net/wikijava/article/details/6245588 Repository 即源码的集中存放处,所有修改后提交的源码就是保存在这里,并在 ...

  3. Ajax详解及其案例分析------如何获得Ajax对象,使用Ajax对象发送GET和POST请求,校验用户名,POST和GET请求时的乱码处理,实现级联的下拉列表

    本节主要内容预览: 1 获得Ajax对象 2 使用Ajax对象发送GET请求 3 使用Ajax对象发送POST请求 4 使用Ajax校验用户名 5 POST请求时的乱码处理 6 GET请求时的乱码处理 ...

  4. js清除缓存方法

    1.加入如下头描述 <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUI ...

  5. linux—【绝对路径与相对路径】与【【文件基本操作】】(4)

    [绝对路径与相对路径] 绝对路径:我们在获得一个文件的时候,从根目录到二级到更多级目录都写全了, 终才找到这个文件,这种方式就是“绝对路径” 相对路径:目标文件与我本身文件的相对位置 当前目录:./  ...

  6. matlab里.*和*的区别

    *:矩阵相乘 (cross) .*:矩阵你元素一对一相乘 (dot) 例子: >> a=[2 3];>> b=[4 5];>> a*b' ans = 23 > ...

  7. 嵌入式开发板iTOP4412学习开发板

    网站:http://www.topeetboard.com 淘宝:https://item.taobao.com/item.htm?_u=okcahs0f42a&id=38712193806 ...

  8. USACO section1.2 Transformation

    /* ID: vincent63 LANG: C TASK: transform */ #include <stdio.h> #include<stdlib.h> #inclu ...

  9. js开发工具箱

    昨天看到一位大牛的博客,里面有一篇文章“web前端开发分享-目录”,文章中提到的一个给前端er用的一个js开发工具箱.自己使用了一下,非常好用,代码压缩,代码美化,加密,解密之类基本功能都有,生成二维 ...

  10. Fisker大师用ZBrush制作兽人萨尔全过程

    十二年前,暴雪推出第一款网络游戏<魔兽世界>,以迅雷不及掩耳盗铃之势风靡全球:十二年后,魔兽终于改编成大电影,同样掀起了一场巨大的风暴, 接二连三打破了多项票房纪录.纵观游戏史,很难找出一 ...