1、题目介绍
- 题目详情【编号45】
- 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
- 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
- 0 <= j <= nums[i] i + j < n
- 返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
2、我的思路及代码
class Solution {
public int jump(int[] nums) {
/**
ps:此题我想了接近半小时也没想出来,以下是看了答案后的结论
方法一:从后往前跳跃法,时间O(n2),空间O(1)
方法二:贪心算法,每次取最长跳跃节点进行跳跃,时间O(n),空间O(1)
1、从0索引处开始遍历数组,每次比较并取得最大能跳跃到的长度为跳跃节点。
2、由于贪心,只要每次跳的越多,那么走到最后一个元素的步数就一定最小。
3、具体细节如下
*/
int max = 0;
int step = 0;
int end = 0;
//这里注意最后一个元素是不需要去遍历的,否则一旦遍历,可能最后正好导致step++
for(int i = 0; i < nums.length - 1; i++){
max = Math.max(max, i + nums[i]);
if(i == end){
end = max;
//重置max跳跃最大值
max = 0;
step++;
}
}
return step;
}
}
3、官方题解
4、结论
- 这题没想出来也是我自己的过错,没想到是贪心算法,每次都求最远的距离就行。
- 这题是上午我看了官方答案,看了几眼,下午才自己想着复刻出来,但是在max那边其实不需要重置为0,本身就是逐步递增的数,不需要重置,所以多此一举了。
- 之后思考要专门去思考是否能双指针、dp(简化版)、贪心等等。