前端算法第一四二弹--跳跃游戏 II

140 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

假设你总是可以到达数组的最后一个位置。

示例 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:

输入: nums = [2,3,0,1,4]
输出: 2

提示:

  • 1<=nums.length<=104`1 <= nums.length <= 10^4`
  • 0 <= nums[i] <= 1000

贪心

  1. 如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。 可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。
  2. 如果从这个 起跳点 起跳叫做第 1 次 跳跃,那么从后面 3 个格子起跳 都 可以叫做第 2 次 跳跃。
  3. 所以,当一次 跳跃 结束时,从下一个格子开始,到现在 能跳到最远的距离,都 是下一次 跳跃 的 起跳点。
  4. 对每一次 跳跃 用 for 循环来模拟。
  5. 跳完一次之后,更新下一次 起跳点 的范围。
  6. 在新的范围内跳,更新 能跳到最远的距离。

记录 跳跃 次数,如果跳到了终点,就得到了结果。

图片.png

/**
 * @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
}

图片.png