“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4]
输出: 2
提示:
0 <= nums[i] <= 1000
贪心
- 如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。 可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。
- 如果从这个 起跳点 起跳叫做第 1 次 跳跃,那么从后面 3 个格子起跳 都 可以叫做第 2 次 跳跃。
- 所以,当一次 跳跃 结束时,从下一个格子开始,到现在 能跳到最远的距离,都 是下一次 跳跃 的 起跳点。
- 对每一次 跳跃 用 for 循环来模拟。
- 跳完一次之后,更新下一次 起跳点 的范围。
- 在新的范围内跳,更新 能跳到最远的距离。
记录 跳跃 次数,如果跳到了终点,就得到了结果。
/**
* @param {number[]} nums
* @return {number}
*/
var jump = function (nums) {
let len = nums.length
// 记录步数
let step = 0
// 当前边界下能跳到的最远距离
let maxPosition = 0;
// 当前边界
let end = 0
for (let i = 0; i < len - 1; i++) {
// 判断当前位置的最远距离和已知最远距离
maxPosition = Math.max(maxPosition,i+nums[i])
// 当前位置是否为本次的最远距离
if(end ==i){
// 将边界扩大
end = maxPosition
// 记录步数
step++
}
}
return step
}