其他分享
首页 > 其他分享> > 打家劫舍Ⅱ

打家劫舍Ⅱ

作者:互联网

一、需求

示例 1:
输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

提示:
1 <= nums.length <= 100
0 <= nums[i] <= 1000

二、动态规划

class Solution {
    public int rob(int[] nums) {
        /*
        分析:
            1.第一间房子与最后一间房子不能同时取钱,那么会有三种情况:
            ①:第一间房子与最后一间房子都不取钱
            ②:第一间房子取钱,最后一间房子不取钱
            ③:第一间房子不取钱,最后一间房子取钱
            2.因为情况②③会包含情况①,因此只需求情况②③对应的最值即可
        */
        int n = nums.length;
        if(n == 1) {
            return nums[0];
        }
        return Math.max(robRange(nums, 0, n - 2), robRange(nums, 1, n - 1));
    }
    // 仅计算闭区间内的最优结果
    public int robRange(int[] nums, int start, int end) {
        int n = nums.length;
        int[] dp = new int[n + 2];
        for(int i = end; i >= start; i--) {
            dp[i] = Math.max(dp[i + 1], dp[i + 2] + nums[i]);
        }
        return dp[start];
    }
}

三、动态规划优化

class Solution {
    public int rob(int[] nums) {
        /*
        分析:
            1.第一间房子与最后一间房子不能同时取钱,那么会有三种情况:
            ①:第一间房子与最后一间房子都不取钱
            ②:第一间房子取钱,最后一间房子不取钱
            ③:第一间房子不取钱,最后一间房子取钱
            2.因为情况②③会包含情况①,因此只需求情况②③对应的最值即可
        */
        int n = nums.length;
        if(n == 1) {
            return nums[0];
        }
        return Math.max(robRange(nums, 0, n - 2), robRange(nums, 1, n - 1));
    }
    // 仅计算闭区间内的最优结果
    public int robRange(int[] nums, int start, int end) {
        // 前面第一间房子
        int pre_1 = 0;
        // 前面第二间房子
        int pre_2 = 0;
        int cur = 0;
        for(int i = end; i >= start; i--) {
            cur = Math.max(pre_1, pre_2 + nums[i]);
            pre_2 = pre_1;
            pre_1 = cur;
        }
        return cur;
    }
}

标签:pre,打家劫舍,nums,int,房子,不取,第一间
来源: https://blog.csdn.net/Sruggle/article/details/117738220