LeetCode: 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.)
SOLUTION 1:
参考:http://blog.csdn.net/fightforyourdream/article/details/14517453
我们可以使用贪心法来解决这个问题。
从后往前思考问题。以 des = len - 1反向思考。思考能到达它的最远的距离是多少。
例子:
2 3 1 1 4
i = 1
上例子中index i = 1是达到4的最远的距离。这时index i = 1 到4是最后一步的最优解,因为其它的解,如果跳到index = 2, 3 到达4为最后一步,那么倒数第二步既然可以到达 index = 2, 3 也可以到达index = 1,所以跳到index = 1步数会是一样的。所以其它的解最好的情况也就是与从index = 1跳过去一样而已。
而前面的点因为距离限制 ,有可能只能跳到index = 1,而不可以跳到index = 2, 3.所以 将倒数第二步设置在index = 1可以得到最多的解。
package Algorithms.greedy;
public class Jump {
public static void main(String[] strs) {
int[] A = {2, 3, 1, 1, 4};
System.out.println(jump(A));
}
public static int jump(int[] A) {
if (A == null || A.length == 0) {
return 0;
}
int len = A.length;
int sum = 0;
int des = len - 1;
while (des > 0) { // destination index
for (int i = 0; i < des; i++) { // 不断向前移动dest
if (A[i] + i >= des) { // 说明从i位置能1步到达dest的位置
sum++;
des = i; // 更新dest位置,下一步就是计算要几步能调到当前i的位置
//break; // 没必要再继续找,因为越早找到的i肯定越靠前,说明这一跳的距离越远
// 这一行可以去掉, des = i,不符合for的条件,会自动break.
System.out.println("sum:" + sum);
System.out.println("des:" + des);
}
}
}
return sum;
}
}
SOLUTION 2:(2015.1.13 redo)
Leetcode增强test case之后,前面的算法不能通过,感谢http://fisherlei.blogspot.com/2012/12/leetcode-jump-ii.html的灵感:
[解题思路]
二指针问题,最大覆盖区间。
从左往右扫描,维护一个覆盖区间,每扫过一个元素,就重新计算覆盖区间的边界。比如,开始时区间[start, end], 遍历A数组的过程中,不断计算A[i]+i最大值(即从i坐标开始最大的覆盖坐标),并设置这个最大覆盖坐标为新的end边界。而新的start边界则为原end+1。不断循环,直到end> n.
// solution 2: one pass greedy.
public int jump(int[] A) {
if (A == null || A.length == ) {
return ;
} // bug:
/*
Input: [1]
Output: 1
Expected: 0
*/
if (A.length == ) {
return ;
} int len = A.length; int start = ;
int end = ; int steps = ;
while (end < len - ) {
int max = ;
steps++;
for (int i = start; i <= end; i++) {
max = Math.max(max, i + A[i]); if (max >= len - ) {
return steps;
}
} start = end + ;
end = max; if (start > end) {
break;
}
} return Integer.MAX_VALUE;
}
GITHUB:
https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/greedy/Jump.java
LeetCode: Jump Game II 解题报告的更多相关文章
- 【LeetCode】Permutations II 解题报告
[题目] Given a collection of numbers that might contain duplicates, return all possible unique permuta ...
- LeetCode: Unique Paths II 解题报告
Unique Paths II Total Accepted: 31019 Total Submissions: 110866My Submissions Question Solution Fol ...
- 【LeetCode】45. Jump Game II 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心 日期 题目地址:https://leetcod ...
- 【原创】leetCodeOj --- Jump Game II 解题报告
原题地址: https://oj.leetcode.com/problems/jump-game-ii/ 题目内容: Given an array of non-negative integers, ...
- LeetCode: Jump Game Total 解题报告
Jump GameGiven an array of non-negative integers, you are initially positioned at the first index of ...
- LeetCode: Spiral Matrix II 解题报告-三种方法解决旋转矩阵问题
Spiral Matrix IIGiven an integer n, generate a square matrix filled with elements from 1 to n2 in sp ...
- LeetCode: Word Break II 解题报告
Word Break II Given a string s and a dictionary of words dict, add spaces in s to construct a senten ...
- LeetCode: Path Sum II 解题报告
Path Sum II Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals ...
- LeetCode: Palindrome Partitioning II 解题报告
Palindrome Partitioning II Given a string s, partition s such that every substring of the partition ...
随机推荐
- 【SqlServer】SqlServer索引的创建、查看、删除
索引加快检索表中数据的方法,它对数据表中一个或者多个列的值进行结构排序,是数据库中一个非常有用的对象. 索引的创建 #1使用企业管理器创建 启动企业管理器--选择数据库------选在要创建索引的表- ...
- 【Oracle】Oracle 的过程化SQL(PLSQL)中NULL值的处理
下面是NULL的几个注意点: 1.NULL值既不是空格也不是0. 2.给表插入值的时候,如果没有给列指定列值,则默认为NULL. 3.当算术表达式里包含NULL值时,其计算结果也是NULL值. 这时候 ...
- Oracle命令(二):Oracle数据库几种启动和关闭方式
一.Oracle数据库几种启动方式 1.startup nomount 非安装启动,这种方式下启动可执行:重建控制文件.重建数据库,读取init.ora文件,启动instance,即启动SGA和后台进 ...
- FCEUX金手指加强版 - 使用Lua脚本语言编写FC/NES金手指脚本
一直觉得大部分的FC/NES模拟器的作弊码金手指不是那么方便使用, 比如魂斗罗1代, 玩家的武器可以通过修改0xAA的值来改变: 0x11为M弹(重机枪),0x12为F弹(圈圈),0x13为S弹(散弹 ...
- 【BZOJ2395】【Balkan 2011】Timeismoney 最小乘积生成树
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...
- SharePoint 2013 Step by Step—— 为终端用户提供故障恢复的解决方案 Part I
Disaster Recovery,我把他直译"故障恢复",或者也可以翻译成 "灾难复原 ".光字面意思就可以领会到,当SharePoint Server发生了 ...
- Set up development environment for apps for SharePoint 2013
SharePoint 2013 support app development pattern.An app for SharePoint is small and isolate applicati ...
- 【转载并整理】ORACLE锁机制
转载文章:http://blog.csdn.net/liuyiy/article/details/25005393 转载文章:http://www.cnblogs.com/jiyuqi/p/37017 ...
- Java Date and Calendar examples
Java Date and Calendar examples This tutorial shows you how to work with java.util.Date and java.uti ...
- ReactNative 环境的搭建和启动(安卓版)
一.JAVA环境 下载 JDK 8.0 添加 %JAVA_HOME% 变量 添加 PATH:%JAVA_HOME%\bin 二.Android环境 下载 Android SDK 修复 SDK Mana ...