[leetcode] 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 is2. (Jump1step from index 0 to 1, then3steps to the last index.)
https://oj.leetcode.com/problems/jump-game-ii/
思路1:先想到了DP,从后向前推,当前位置最小步数取决于其所能到达范围内最小的步数,所以需要遍历其覆盖范围,复杂度略高,不是O(n)的算法,目测超时。
思路2:贪心。维护几个变量,curReach,nextReach,每次在curReach的范围内更新nextReach,直到curReach覆盖到结尾。
public class Solution { public int jump(int[] A) { if (A == null || A.length < 2) return 0; int n = A.length; int step = 0; int curReach = 0; int nextReach = 0; int i; for (i = 0; i < n;) { if (curReach >= n - 1) break; while (i <= curReach) { nextReach = nextReach > (i + A[i]) ? nextReach : (i + A[i]); i++; } curReach = nextReach; step++; } return step; } public static void main(String[] args) { System.out.println(new Solution() .jump(new int[] { 2, 3, 1, 1, 1, 2, 3 })); } }
第二遍记录:
每次在curReach内遍历元素,计算下一步可以到达的nextReach,当curReach覆盖n-1时结束。
public class Solution { public int jump(int[] A) { int n = A.length; int curReach=0; int nextReach=0; int count=0; for(int i=0;i<n;){ if(curReach>=n-1) return count; while(i<=curReach){ nextReach=Math.max(nextReach,i+A[i]); i++; } count++; curReach=nextReach; } return count; } }
参考:
http://www.cnblogs.com/lichen782/p/leetcode_Jump_Game_II.html