js-leetcode前端动态规划入门第四天刷题打卡「跳跃游戏」贪心大法!

Posted 一百个Chocolate

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js-leetcode前端动态规划入门第四天刷题打卡「跳跃游戏」贪心大法!相关的知识,希望对你有一定的参考价值。

55. 跳跃游戏

解题思路

一切都可以用暴力解决。

读完题之后,感觉并没有动态规划的思想,而用贪心思想做就好了。

本题主要是判断能不能跳到最后,那么我们就暴力呗,从第 2 个位置开始跳,核心点在于当前位置之前的都是能跳到的。

那么当前位置能不能跳到,就判断从当前位置的前一个位置往前逐一找,看能不能调到当前位置,只要跳不到,直接返回 false 即可,那么当每个路段都能跳到之后,才能为 true。

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canJump = function(nums) {
    let isOk = true;
    for(let i=1;i<nums.length&&isOk;i++){
        for(let j=i-1;j>=0;j--){
            if(nums[j] >= i-j){
                isOk = true;
                break;
            }
            else {
                isOk = false;
            }
        }
    }
    return isOk;
};

45. 跳跃游戏 II

解题思路

本题保证能够跳到最后,然后是计算最小跳跃次数。

我用 endPos 记录我每选择跳一步能够走的最远距离,然后在这个最远距离内,不断地寻找下一步能够跳的最远距离,即:

curEndPos = Math.max(curEndPos, i+nums[i]);

如果我发现在上一步能够跳的这个最远距离内寻找下一步跳的距离能够 大于或等于 终点位置,直接加一步,然后不用循环走了,这也是一个剪枝优化点。

if(i+nums[i] >=nums.length-1) {
   cnt++;
   break;
}

当我走到上一步能够跳的最远距离末端的时候,就要想着我要走下一步了,是不是应该选择下一步能够跳的最远距离,因此:

if(i == endPos) {
   endPos = curEndPos;
   cnt++;
}
/**
 * @param {number[]} nums
 * @return {number}
 */
var jump = function(nums) {
    let cnt = 0; // 返回的最小步数
    let endPos = 0; // 记录最远距离
    let curEndPos = 0; // 记录当前能跳的最远距离
    for(let i=0;i<nums.length-1;i++) {
        curEndPos = Math.max(curEndPos, i+nums[i]);
        if(i+nums[i] >=nums.length-1) {
            cnt++;
            break;
        }
        if(i == endPos) {
            endPos = curEndPos;
            cnt++;
        }
    }
    return cnt;
};

学如逆水行舟,不进则退

以上是关于js-leetcode前端动态规划入门第四天刷题打卡「跳跃游戏」贪心大法!的主要内容,如果未能解决你的问题,请参考以下文章

冲刺大厂每日算法&面试题,动态规划21天——第四天

冲刺大厂每日算法&面试题,动态规划21天——第十四天

leetcode专项 动态规划入门

leetcode专项 动态规划入门

leetcode专项 动态规划入门

每日算法&面试题,算法特训十四天——第一天