LeetCode 45.跳跃游戏2

https://leetcode-cn.com/problems/jump-game-ii/
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

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

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

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

思路:
贪心算法,即每次在可选择的范围内都选择可以跳到更远的位置,即可获得跳跃最小的次数。
例如:[2, 3, 1, 4, 1, 2]
第一步在2的位置,可以选择挑到3,或者跳到1。由于跳到3可以跳到更远的位置,所以选择3。
第二步在3的位置,可以选择跳1,4,1,由于4可以跳到更远的位置,所以选择4。

此处注意,遍历时长度为num.length - 1, 因为从第0个位置开始计算时,step已经+1了,而跳到最后末尾的位置时,其实是不需要给step再+1的。

var jump = function(nums) {
    let end = 0
    let k = 0
    let step = 0
    for(let i = 0; i < nums.length - 1; i++) {
        k = Math.max(k, i + nums[i])
        if(i === end) {
            end = k
            step++
        }
    }
    return step
};

思路2:
从最后一个位置向前查找,找到离它最远的可以到达最后位置的位置,即为最优解,再在这个位置向前找,依次可以找出最优解,即为最小步数。

var jump = function(nums) {
    let step = 0
    let position = nums.length - 1
    while(position !== 0) {
        for(let i = 0; i < position; i++) {
            if(nums[i] >= position - i) {
                step++
                position = i
                break
            }
        }
    }
    return step
};

你可能感兴趣的:(leetCode刷题,leetcode,动态规划,算法)