目录
1,题目
给定一个长度为 n
的 0 索引 整数数组 nums
。初始位置为 nums[0]
。
每个元素 nums[i]
表示从索引 i
向前跳转的最大长度。换句话说,如果你在 nums[i]
处,你可以跳转到任意 nums[i + j]
处:
2,代码
贪心算法+正向查找
javascript
/**
* @param {number[]} nums
* @return {number}
*/
var jump = function(nums) {
let jumpsTemp = 0;
let end = 0;
let maxPosition = 0;
let steps = 0;
for(let i = 0;i<nums.length-1;i++){
maxPosition = Math.max(maxPosition,i+nums[i]);
if(i === end){
end = maxPosition;
steps++;
}
}
return steps;
};
javascript
for(let i = 0;i<nums.length-1;i++){
maxPosition = Math.max(maxPosition,i+nums[i]);
if(i === end){
end = maxPosition;
steps++;
}
}
end和maxPosition变量的值 和数组下标值保持一致,便于数据的使用;
3,学习
解题思路
每次找到可以到达的最远位置,就可以实现线性时间内得到最少的跳跃次数。
具体代码处理
思路中 应该是在每次最远距离中选择下一跳最远的,才进行step++,这里做了转化。
维护当前能够到达的最大下标位置,记作边界。我们从左到右遍历数组,当到达边界的时候,更新边界并将跳跃次数增加。
相比于两层嵌套的循环,在时间上从O(n*n)变为O(n);
数组遍历的最后边界的处理:
我们不用访问最后一个元素,是因为在访问最后一个元素之前,我们的边界一定大于等于最后一个元素,否则无法调到最后一个位置。
勉励自己:贵在坚持!