【题目】数组
给定数组 arr, arr[i] = k 表明能够从位置 i 向右跳 1~k 个距离。好比,arr[2] == 3, 表明从位置 2 能够跳到位置三、位置4或位置5。若是从位置 0 出现,返回最少跳几回能跳到 arr 最后的位置上。spa
【举例】code
arr=[3, 2, 3, 1, 1, 4]。blog
arr[0] = 3, 选择跳到位置 2; arr[2] = 3, 能够跳到最后的位置,因此返回 2。class
【要求】变量
若是 arr 的长度为 N, 要求实现时间复杂度为 O(N), 额外空间复杂度为 O(1)。遍历
【难度】方法
一星next
【解答】static
3. next 表明着位置 i 前面的位置多跳一步能够到达的最远位置, i + arr[i] 表明着从位置 i 多跳一步能够到达的位置,二者之间的最大值 Math.max(next, i+arr[i]) 即为达到位置 i 或 位置 i 以前的位置多跳一步能够达到的最远位置, 赋值给 next.
具体代码实现请参考以下代码中的 jump 方法:
1 public class Main { 2 3 public static void main(String[] args) { 4 int[] arr = {3,2,3,1,1,4}; 5 System.out.println(new Main().jump(arr)); 6 } 7 8 public int jump(int[] arr){ 9 if(arr == null || arr.length < 2) return 0; 10 int jump = 0; //表示跳跃步数 11 int cur = 0; //表示跳跃 jump 步, 即当前能够到达的最远位置 12 int next = 0; //表示多跳跃一步, 能够到达的最远位置 13 14 for(int i = 0, len = arr.length; i < len; i++){ 15 if(cur < i){//若当前不能达到位置 i, 则须要多跳一步, 并使 cur 指向多跳一步能达到的最远位置 16 jump++; 17 cur = next; 18 if(cur >= len - 1){ 19 return jump; 20 } 21 } 22 next = Math.max(next, i + arr[i]); 23 } 24 25 return jump; 26 } 27 28 }