最小步数移动到数组末尾:
给定一个数组,里面全是正整数。数字大小表示这一步最多可以向后移动几个节点。
总是从数组第一个元素开始移动。问如何移动,可以以最少步数移动到最后一个节点。
例如:[3,4,2,1,3,1]初始状态指向3表示下一步可以移动1格,或者2格,或者3格。
最优的方式是指向3的时候移动一步,第二次选择移动4步,一共只需要两步即可移动到数组尾。
public int minimumStepNumber1(int[] nums) {
//记录步数
int step = 0;
//记录本次移动了几步
int temp = 0;
if (nums.length == 1) {
return 0;
}
if (nums[0] >= nums.length - 1) {
return step + 1;
}
for (int i = 0; i < nums.length; ) {
//记录从当前位置经过两次跳跃能达到的最大距离
int longestDistance = 0;
for (int j = 1; j <= nums[i]; j++) {
//判断接下来一次跳跃能否到达最后一个点,能的话就返回 step+1
if (i + j >= nums.length - 1) {
return step + 1;
}
//判断接下来两次跳跃能否到达最后一个点,能的话就返回 step+2
if (i + j + nums[i + j] >= nums.length - 1) {
return step + 2;
}
if (j + nums[i + j] > longestDistance) {
longestDistance = j + nums[i + j];
temp = j;
}
}
i = i + temp;
step++;
}
return -1;
}