leetcode lcp09 最小跳跃次数

505 阅读1分钟
/**
 * @param {number[]} jump
 * @return {number}
 */
var minJump = function(jump) {
    const n = jump.length
    const dp = new Array(n)
    // 最后一个点直接就出去了
    dp[n - 1] = 1
    for(let i = n - 2; i >= 0; i--) {
        // 先只考虑往后跳,能直接跳出去就直接跳出去,跳不出去就暂时往后跳
        dp[i] = (jump[i] + i) >= n ? 1 : dp[jump[i] + i] + 1
        // 在下一轮考虑往前跳, 修正前面的结果, 如果能以更小的代价跳出去, 那就更换跳的方式
        for(let j = i + 1; (j < n) && (dp[j] >= (dp[i] + 1)); j++) dp[j] = dp[i] + 1
    }
    // 第一个点无法往前跳
    return dp[0]
};