题目:
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.)
Note:
You can assume that you can always reach the last index.
本题的目的是寻找到达数组末尾的最小跳数,一种比较简单的思路是使用一个变量记录当前可以到达的最远距离,每当走到了最远距离处,都把步数加一,然后每遍历一个数都要将该变量的值进行更新即可。这也就是所谓的贪婪法,我们总是想走到最远的地方知道没有办法才将步数加一。代码入下:
public int jump(int[] A) {
int jumps = 0, curEnd = 0, curFarthest = 0;
for (int i = 0; i < A.length - 1; i++) {
curFarthest = Math.max(curFarthest, i + A[i]);
if (i == curEnd) {
jumps++;
curEnd = curFarthest;
}
}
return jumps;
}
另外一种思路就是使用BFS,深度优先遍历的方法,我们可以将题目转化为深度遍历到题目,如下,每一层是上一层所能达到的最远距离。这样我们就可以很方便的使用BFS来解:
2 3 1 1 4 , is
2||
3 1||
1 4 ||
代码如下所示:
int jump2(int A[]) {
if(A.length<2)return 0;
int level=0,currentMax=0,i=0,nextMax=0;
while(currentMax-i+1>0){ //nodes count of current level>0
level++;
for(;i<=currentMax;i++){ //traverse current level , and update the max reach of next level
nextMax=Math.max(nextMax,A[i]+i);
if(nextMax>=A.length-1)return level; // if last element is in level+1, then the min jump=level
}
currentMax=nextMax;
}
return 0;
}