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 ...
随机推荐
- Kafka 如何读取指定topic中的offset -------------用来验证分区是不是均衡!!!(__consumer_offsets)(已验证!)
我现在使用的是librdkafka 的C/C++ 的客户端来生产消息,用flume来辅助处理异常的数据,,, 但是在前段时间,单独使用flume测试的时候发现,flume不能对分区进行负载均衡!同一个 ...
- C++中四种类型转换方式(ynamic_cast,const_cast,static_cast,reinterpret_cast)
Q:什么是C风格转换?什么是static_cast, dynamic_cast 以及 reinterpret_cast?区别是什么?为什么要注意? A:转换的含义是通过改变一个变量的类型为别的类型从而 ...
- Ubuntu菜鸟入门(十一)—— windows 和 ubuntu时间冲突解决
一.问题原由 Ubuntu和Windows默认的时间管理方式不同,所以双系统发生时间错乱是正常的 Ubuntu默认时间是把BIOS时间当成GMT+0时间,也就是世界标准时,而我国在东八区(GMT+8) ...
- MySQL子查询的优化
本文基于MySQL5.7.19测试 创建四张表,pt1.pt2表加上主键 mysql> create table t1 (a1 int, b1 int); mysql> create ta ...
- 验证时出错。HRESULT = '8000000A'
这本来是在VS2005下创建的一下项目,后来改用VS2010的开发环境,.NET Framework的版本号还是使用2.0, 但每次生成之后都会在解决方式的同级文件夹下产生一个名称乱码的文件夹, 攻克 ...
- SharePoint自动化部署,利用SPSD工具包
目录 怎样使用SPSD 配置Environment XML文件 PowerShell激活Feature 上篇博客讲了利用PowerShell导出.导入AD中的Users.这篇介绍简单介绍一下SPSD ...
- 5.翻译:EF基础系列---EF中的上下文类
原文地址:http://www.entityframeworktutorial.net/basics/context-class-in-entity-framework.aspx EF中的上下文类是一 ...
- Vivado抓取信号
作者:桂. 时间:2018-05-03 21:16:03 链接:www.cnblogs.com/xingshansi/p/8987608.html 前言 FPGA调试需要抓取特定信号,一个直观的思路 ...
- 基础004_V7-DSP Slice
主要参考ug479.pdf.之前的文章:FIR调用DSP48E_05.本文主要记录基本用法. 一.DSP48核 A-参数说明 instrctions,多个功能,通过sel选用 目前没发现C勾选与否,有 ...
- php分享十五:php的数据库操作
一:术语解释: What is an Extension? API和扩展不能理解为一个东西,因为扩展不一定暴露一个api给用户 The PDO MySQL driver extension, for ...