LeetCode:Jump Game I II
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的更多相关文章
- leetcode Jump Game I II 待续 贪心看不懂啊!!!!
下面是这两个题的解法: 参考博客:http://blog.csdn.net/loverooney/article/details/38455475 自己写的第一题(TLE): #include< ...
- LeetCode Single Number I / II / III
[1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...
- [array] leetcode - 40. Combination Sum II - Medium
leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...
- LeetCode 137. Single Number II(只出现一次的数字 II)
LeetCode 137. Single Number II(只出现一次的数字 II)
- LeetCode:路径总和II【113】
LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...
- LeetCode:组合总数II【40】
LeetCode:组合总数II[40] 题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candi ...
- LeetCode: Jump Game II 解题报告
Jump Game II Given an array of non-negative integers, you are initially positioned at the first inde ...
- [LeetCode] Jump Game II 跳跃游戏之二
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- 【leetcode】Jump Game I & II (hard)
Jump Game (middle) Given an array of non-negative integers, you are initially positioned at the firs ...
随机推荐
- 详解Winform里面的缓存使用
缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力.本文主要针对自己在Winform方面的缓存使用做一个引导性的介绍,希望大家能够从中了解一些缓存 ...
- SQL Server 2008 R2——VC++ ADO 操作 事务
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- Java NIO入门(二):缓冲区内部细节
Java NIO 入门(二)缓冲区内部细节 概述 本文将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor). 状态变量是前一文中提到的"内部统计机制"的 ...
- 移动语义 && 函数调用过程中的 lvalue
当以一个函数内的临时变量对象作为另一个函数的形参的时候,原函数内的临时对象即 rvalue,就会成为此函数内的 lvalue. 这样会重新导致效率低下,因为造成了大量复制操作. <utility ...
- 数据结构--线段树--lazy延迟操作
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 53749 ...
- 【ubuntu】中文输入法安装二三事
本来很愉快地刷着JS程序,很有感慨啊,想写篇博客记一下学习笔记,结果忘记了博客账号,后来通过邮箱找回了之后想要开始写..发现ubuntu的中文输入法不能用啊(其实不是不能用,就是小白没搞清楚状况,双系 ...
- SQL SERVER 2012 使用订阅发布同步数据库
软件做大了,客户就多了,一个数据库服务器是远远不够的,当有一台数据服务器卦掉,那整个系统就会崩溃,所以必须考虑到数据库的自动同步与备份,当一台数据库服务 器宕机,自然就有用一台数据服务器启动起来保证整 ...
- hdu-1789-Doing Homework again
/* Doing Homework again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- Web性能优化之动态合并JS/CSS文件并缓存客户端
来源:微信公众号CodeL 在Web开发过程中,会产生很多的js/css文件,传统的引用外部文件的方式会产生多次的http请求,从而加重服务器负担且网页加载缓慢,如何在一次请求中将多个文件一次加载出来 ...
- 最小生成树 2429: [HAOI2006]聪明的猴子
BZOJ 2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 877 Solved: 566[Submit][ ...