题目:
给定数组arr,arr[i]==k 代表可以从位置 i 向右跳 1~k 个距离。比如 arr[2] ==3,就是可以从2位置挑1~3个举例,可以跳到位置3,位置4,位置5上。如果从位置0出发,返回最少跳几次能跳到arr最后的位置上。
举例:
arr = [3,2,3,1,1,4]
arr[0] ==3,选择跳两步到位置2,arr[2]==3,直接跳三步到位置5,返回2。
思路:
准备整型变量 jump:表示目前跳了多少步
整型变量cur:表示如果只能跳jump步,最远能达到的位置。
整型变量next:表示如果再多跳一步,最远能够达到的位置。
初始时都是0
从左到右遍历arr,假设遍历到位置 i
1) 如果cur >= i,说明跳jump步可以到达位置 i ,什么都不做
2) 如果cur < i ,说明只跳jump步不能到达位置 i,需要多跳一步才行。 此时令 jump++,cur=next。表示多跳了一步,cur更新成跳jump+1步能够达到的位置,即next。
3) 将next更新成math.max(next, i+ arr[i]) ,表示下一次多跳一步到达的最远位置。
返回最终的jump。
public static int jump(int[] arr) {
if (arr == null || arr.length == 0) {
return 0;
}
int jump = 0;
int cur = 0;
int next = 0;
for (int i = 0; i < arr.length; i++) {
if (cur < i) {
jump++;
cur = next;
}
next = Math.max(next, i + arr[i]);
}
return jump;
}