【题目】给定数组arr,arr[i] == k代表可以从位置i向右跳1~k个距离。比如arr[2] ==3,代表从位置2可以跳到位置3、位置4、位置5.如果从位置0出发,返回最少跳几次能跳到arr最后的位置上。
【举例】arr = [3,2,3,1,1,4].
arr[0] == 3, 选择跳到位置2,arr[2] == 3,可以跳到最后的位置,所以返回2.
【要求】如果arr长度为N,要求实现时间复杂度为O(N)、额外空间复杂度为O(1)的方法。
public class Jump {
public static int jump(int[] arr) {
if (arr.length == 0 || arr == null) {
return 0;
}
int jump = 0; // 代表目前跳了多少步
int cur = 0; // 代表代表如果只跳jump步,最远能到的位置
int 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]),表示下一次多跳一步到达的最远位置。
*/
for (int i = 0; i < arr.length; i++) {
if (cur < i) {
jump++;
cur = next;
}
next = Math.max(next, i + arr[i]);
}
return jump;
}
}