题目
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
解题思路
贪心算法,使用局部最优解,每次跳跃时都去找能跳的范围内最大的那个然后继续
比如[2,3,1,1,4,7]
当前为2时,可以跳到3或1的位置,那么选其中最大,跳到3,然后选能跳的3步中最大的4,如此往复,如果能跳到最后,那么跳的次数一定是最少的。
代码方面,因为有跳的动作,所以需要知道什么时候该跳,往哪跳,那就需要两个变量来不断的告诉程序如何执行跳的动作。
先说往哪跳,可以确定的知道是在某个范围内能跳的最远的下标,能跳的最远计算应该为index(当前在哪)+nums[index](能跳多远); 可用三目或Max函数不断求得即可。
另外什么时候跳,仔细想下就是上面提到的那某个范围的终点,这个范围也好理解,其实就是上次跳到的那个位置的下标。在循环里,用(curIndex == i)判断就可得知是不是该跳了,当然,这个值一开始为0;
代码
class Solution {
public int jump(int[] nums) {
if (nums.length == 0) return 0;
int jumpCount = 0;
int curIndex = 0;
int nextIndex = 0;
for (int i = 0 ; i < nums.length -1; i++){
nextIndex = (nums[i]+i) > nextIndex ? (nums[i]+i) : nextIndex;
if (curIndex == i){
curIndex = nextIndex;
jumpCount ++;
}
}
return jumpCount;
}
}