js 前端动态规划刷题第三天打卡 打家劫舍(I 与 II),一个函数解决两个问题

Posted 一百个Chocolate

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 前端动态规划刷题第三天打卡 打家劫舍(I 与 II),一个函数解决两个问题相关的知识,希望对你有一定的参考价值。

198. 打家劫舍

198. 打家劫舍

解题思路

明白这道题,「213. 打家劫舍 II」也就自然明白了。

首先,亮出 dp 状态方程

dp[i] = Math.max(dp[i-1], dp[i-2]+ nums[i]);

只有一家的时候,废话不多说,偷就完事了。

两家的话,对比一下,看哪一家有钱就偷哪家。

重点在于有三家以上的情况,对于这题来说,从第 2 家开始,如果偷这家,那就加上前两家的金钱(非累计)

如果不偷,就加上前一家的金钱(非累计)

看最后两家相邻的房屋累计的结果值最大

代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var robValue = function(nums, left, right) {
    if(nums.length === 1) return nums[left];
    else if(nums.length ===2) return Math.max(nums[left], nums[right]);
    else {
        let dp = new Array(nums.length);
        dp[left] = nums[left];
        dp[left+1] = nums[left+1];
        // 从第 2 家开始,如果偷这家,那就加上前两家的金钱(非累计)
        // 如果不偷,就加上前一家的金钱(非累计)
        for(let i=left+1;i<=right;i++){
            // 边界条件
            if(i-2 < 0 || i-2 < left) dp[i-2] = 0;
            dp[i] = Math.max(dp[i-1], dp[i-2]+ nums[i]);
        }
        // 看最后两家相邻的房屋累计的结果值最大
        return Math.max(dp[right], dp[right-1]);
    }
}

var rob = function(nums) {
    return robValue(nums, 0, nums.length-1);
};

213. 打家劫舍 II

解题思路

这个和「198. 打家劫舍」对比来说,就多个条件。

那么,我们在上一题的基础上调用两次封装的函数就好了。

一次调用条件是去掉第一家,二次调用条件是去掉最后一家,这样就不会出现首尾都偷的情况了,最后我们比对最大值返回就好了。

/**
 * @param {number[]} nums
 * @return {number}
 */
var robValue = function(nums, left, right) {
    if(nums.length === 1) return nums[left];
    else if(nums.length ===2) return Math.max(nums[left], nums[right]);
    else {
        let dp = new Array(nums.length);
        dp[left] = nums[left];
        dp[left+1] = nums[left+1];
        // 从第 2 家开始,如果偷这家,那就加上前两家的金钱(非累计)
        // 如果不偷,就加上前一家的金钱(非累计)
        for(let i=left+1;i<=right;i++){
            // 边界条件
            if(i-2 < 0 || i-2 < left) dp[i-2] = 0;
            dp[i] = Math.max(dp[i-1], dp[i-2]+ nums[i]);
        }
        // 看最后两家相邻的房屋累计的结果值最大
        return Math.max(dp[right], dp[right-1]);
    }
}
var rob = function(nums) {
    if(nums.length === 1) return nums[0];
    else if(nums.length === 2) return Math.max(nums[0], nums[1]);
    else {
        return Math.max(robValue(nums, 0, nums.length-2), robValue(nums, 1, nums.length-1));
    }
};

学如逆水行舟,不进则退

以上是关于js 前端动态规划刷题第三天打卡 打家劫舍(I 与 II),一个函数解决两个问题的主要内容,如果未能解决你的问题,请参考以下文章

算法刷题打卡041 | 动态规划9-打家劫舍系列

HankerRank刷题第三天(string类型)

LeetCode刷题笔记-动态规划-day3

LeetCode刷题笔记-动态规划-day3

LeetCode刷题笔记-动态规划-day3

leetcode之动态规划刷题总结3