给出一组正整数arr,你从第0个数向最后一个数,每个数的值表示你从这个位置可以向右跳跃的最大长度,计算如何以最少的跳跃次数跳到最后一个数。
假设我们现在已经跳跃到了第四步,那么第五步的边界由第四步边界内各值加上arr数组上对应的最大长度取最大值,即为第五步可以到达的最右边界。
以下面arr[3, 1, 4, 2, 1, 1, 5, 2, 1, 1]为例,这里有三个变量值分别为:step(表示目前走了几步)、curR(当前step步的右边界)、next(step+1步的右边界)。数组arr的下标用i表示。
具体流程如下:
- public static int jump(int[] arr) {
- if (arr == null || arr.length == 0) {
- return 0;
- }
- int step = 0;//跳了多少步
- int curR = 0;//step步内,右边界
- int next = 0;//step+1步内,右边界
- for (int i = 0; i < arr.length; i++) {
- if (curR < i) {
- step++;
- curR = next;
- }
- next = Math.max(next, i + arr[i]);
- }
- return step;
- }
-
- public static void main(String[] args) {
- int[] arr = {3, 1, 4, 2, 1, 1, 5, 2, 1, 1};
- System.out.println(jump(arr));
- }