「LeetCode」45-跳跃游戏 II

156 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

一.题目:

45. 跳跃游戏 II 给你一个非负整数数组 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
  • 0 <= nums[i] <= 1000

二、思路分析:

这道题目如果采取常规的动态规划就会超时,即使你利用备忘录解决了重叠子问题,所以这道题目我们需要采用贪心算法的思想来解决。因为我们需要求得最少跳跃步数,所以我们需要尽量选择步数最大的值。

这里我们的贪心策略是一开始就寻找每个下标的最大覆盖步数,比如下标为0的时候farthest就是2,这个时候我们的步数加一直至遇到这个最大的覆盖步数我们才更新当前的覆盖最远距离的下标,否则就一直更新最大覆盖步数,这里我们需要注意,我们没有选择数组最后一个元素是因为如果最大覆盖步数是倒数第二个的话,我们就可以步数在加一,如果步数最大超过了倒数第二个那么它就一定能够不需要通过加步数的方式到达终点。

image.png

三、代码:

/**
 * @param {number[]} nums
 * @return {number}
 */
var jump = function(nums) {
    let n = nums.length
    let end =0
    let farthest = 0
    let step = 0
    for(let i=0 ; i<n-1 ; i++){
        farthest = Math.max(farthest,i+nums[i])
        if(end == i){
            step++
            end = farthest
        }
    }
    return step
};

四、总结:

这道题的贪心思路其实很难想到,但是如果能够吃透贪心算法的思想的话,这样的题目就会变得非常简单,了解贪心算法,了解贪心选择结构,是我们应该要去学会的。