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.

Solutions:

1. DP1
每到一个点 i,我们扫描之前所有的点,如果之前某点j本身可达,并且与current 点可达,表示点i是可达的。

返回值:DP数组的最后一个值。

 // DP1.
public boolean canJump1(int[] A) {
if (A == null || A.length == 0) {
return false;
} int len = A.length;
boolean[] can = new boolean[len];
can[0] = true; for (int i = 1; i < len; i++) {
can[i] = false;
for (int j = 0; j < i; j++) {
// j can arrive and can jump to i.
if (can[j] && A[j] >= i - j) {
can[i] = true;
break;
}
}
} return can[len - 1];
}

2. DP2
优化的点1:既然某点可达,肯定前面的点全部是可达的。这个比较好理解。因为你到达i点肯定要经过前面的一个点,这个依次推知可知前面所有的点可达。

所以我们不需要数组来记录结果,只要默认i点前全部可达就行了。

优化点2:如果某点不可达了,直接返回false。不需要再往后计算。

返回值:如果全部扫完仍没有返回false,返回true。

 // DP2.
public boolean canJump2(int[] A) {
if (A == null || A.length == 0) {
return false;
} int len = A.length; for (int i = 1; i < len; i++) {
boolean can = false;
for (int j = 0; j < i; j++) {
// j can arrive and can jump to i.
if (A[j] >= i - j) {
// 说明i是可达的,置标记位
can = true;
break;
}
} // 优化:如果某一步已经到不了了,后面的也不必再计算了.
if (!can) {
return false;
}
} return true;
}

3. 递归
思想是,从前至尾扫描,至第一个距离与本点可达的点j,计算j点是否可达。使用递归计算j

点的可达性。

其实这里还是用到了贪心的思维。在考虑本点是否可达的时候,我们是考虑与本点最远的一个点是否可达。实际上这也make sense。

假设j点可以到达i点,那么后面的点可以不管。

(1)因为如果j点不可达,那么j+1也不可达。如果i不可达,后面的点也可不算。

(2)如果j点可达,并且j点可到达i,那么也没有必要再往后计算了。因为结论已经出来了。

(3) 如果j点可达,但j不可达i,那么就继续计算。

 // 3. DFS.
public static boolean canJump3(int[] A) {
if (A == null || A.length == 0) {
return false;
} return canJump(A, A.length - 1);
} public static boolean canJump(int[] A, int index) {
if (index == 0) {
return true;
} for (int i = 0; i <= index - 1; i++) {
if (A[i] >= index - i) {
return canJump(A, i);
}
} return false;
}

4. 贪心法(2015.1.13 redo)

Leetcode加强了test case,用动规现在是过不了的。我们现在来使用贪心法One pass解决此问题。

维护一个right (表示右边能跳到的最远的点),从左往右扫描,根据当前可跳的步骤不断更新right ,当right到达终点,即可返回true. 若更新完right后,right未

动,并且index = right,而且这时没到达终点,代表我们不可能到达终点了。(当前index的可跳值应该是0)。

 // solution 3: one pass.
public boolean canJump(int[] A) {
// 4:42
if (A == null) {
return false;
} int len = A.length; int right = ;
for (int i = ; i < A.length; i++) {
right = Math.max(right, i + A[i]);
if (right == len - ) {
return true;
} if (i == right) {
return false;
}
} return true;
}

5. GitHub代码

CanJump.java

References:

感谢http://blog.csdn.net/fightforyourdream/article/details/14219049给予的灵感。

最新文章

  1. jmeter 远程测试
  2. 《Java程序设计》第7周学习总结
  3. ios 7 20像素解决
  4. [原创]SSIS-WMI 数据读取器任务:监控物理磁盘空间
  5. Android微信支付SDK开发笔记
  6. 13个SQL优化技巧
  7. 修改npm包管理器的registry为淘宝镜像(npm.taobao.org)
  8. USB枚举详细过程剖析(转)
  9. c语言: 文件io, 拷贝文件(二进制)
  10. Python进阶之装饰器
  11. 3Des加解密 C#---&gt;Java
  12. 简易调色盘控件 for .NET(EN)
  13. Contest2178 - 2019-4-18 高一noip基础知识点 测试7 题解版
  14. 汇编语言 实验14 访问CMOS RAM
  15. C# int[,] 和 int[][]
  16. java操作docker示例(docker-java)
  17. Win10专业版激活
  18. 二次剩余从csdn
  19. 738. Monotone Increasing Digits 单调递增的最接近数字
  20. sed学习[参考转载]

热门文章

  1. MATLAB 的输入输出命令
  2. javascript TODO
  3. UICollectionView Demo
  4. iOS 设备屏幕上实时打印 Log 的小工具
  5. 日志收集-Flume-ng-mongodb-sink
  6. 【web】a标签点击时跳出确认框
  7. PHOTOSHOP中3D下拉菜单为灰色如何设置
  8. easyui combobox 动态加载的两种方法
  9. SQLAlchemy(2) -- SQLAlchemy的安装
  10. WPF:“wpf类库项目改为Window应用程序项目”系列问题