leetcode
leetcode 2951 ~ 3000
打家劫舍 II

打家劫舍 II

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 20 ms, 内存: 16.1 MB


/*
题目思路:
1. 由于房屋围成一圈,不能同时偷第一个和最后一个房屋。
2. 分为两种情况:
   a. 偷第一间,不偷最后一间。
   b. 不偷第一间,偷最后一间。
3. 分别计算这两种情况下的最大偷窃金额,取两者最大值。
4. 可以复用之前House Robber问题的解决方案,使用动态规划来解决。*/

import java.util.Arrays;
import java.util.stream.IntStream;

public class Solution {
    public int rob(int[] nums) {
        if (nums.length == 1) return nums[0];
        return Math.max(robLinear(Arrays.copyOfRange(nums, 0, nums.length - 1)),
                        robLinear(Arrays.copyOfRange(nums, 1, nums.length)));
    }

    private int robLinear(int[] nums) {
        int[] result = {0, 0};
        IntStream.of(nums).forEach(num -> {
            int temp = result[1];
            result[1] = Math.max(result[0] + num, result[1]);
            result[0] = temp;
        });
        return result[1];
    }
}

解释

方法:

此问题是经典的打家劫舍问题的变种,其中房屋是环形排列的。由于第一个和最后一个房屋相邻,不能同时偷窃,因此问题可以分解为两个子问题:1)偷窃第一间到倒数第二间房屋的最大金额;2)偷窃第二间到最后一间房屋的最大金额。通过解决这两个子问题,取二者的最大值即可得到整个问题的解。内部函数rob处理的是标准的线性房屋排列的打家劫舍问题,使用动态规划的思想,其中cur表示当前房屋的最大偷窃金额,pre表示前一间房屋的最大偷窃金额。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
在解决环形房屋偷窃问题时,分解成两个子问题(偷窃第一间到倒数第二间和偷窃第二间到最后一间)的方法是否总是有效?是否存在特殊情况下这种方法会出现问题?
分解成两个子问题的方法在大多数情况下是有效的,因为这种方法确保了我们没有同时偷窃第一个和最后一个相邻的房屋。然而,需要注意的是,如果房屋数量非常少,比如只有两间房屋,这种分解就会导致某个子问题中没有房屋可偷(例如偷第二间到最后一间,但实际上只有两间房屋,第一间和第二间是同一间)。因此,当房屋数量少于三间时,这种分解需要特别的处理逻辑。
🦆
函数rob中使用了动态规划的方法,其中`cur, pre = max(pre + num, cur), cur`这行代码的具体逻辑是什么?能否详细解释这个状态转移方程?
在动态规划的方法中,`cur`表示当前考虑的房屋能够提供的最大偷窃金额,而`pre`表示前一间房屋能提供的最大偷窃金额。状态转移方程`cur, pre = max(pre + num, cur), cur`的逻辑是:对于当前房屋,我们有两种选择,一是偷窃当前房屋加上前一个房屋留下的最大金额(`pre + num`),二是不偷当前房屋保持当前的最大金额(`cur`)。我们选择这两者之间的最大值作为新的`cur`。然后原始的`cur`值变成新的`pre`值,为下一轮迭代做准备。这确保了我们在遍历房屋时始终保持最大偷窃金额的更新。
🦆
在给定的解法中,对于只有一间或没有房屋的特殊情况已经进行了处理。对于只有两间房屋的情况,这种方法处理的结果是正确的吗?如何验证?
对于只有两间房屋的情况,按照给定的解法,将分成两个子问题:1) 偷第一间到倒数第二间(即只偷第一间),2) 偷第二间到最后一间(即只偷第二间)。由于房屋数量只有两间,这两个子问题都只包含一间房屋,因此解决这两个子问题并取最大值的方法是正确的。可以通过直接比较两间房屋的金额来验证这一点,即直接返回`max(nums[0], nums[1])`。这种方法在只有两间房屋的情况下能够正确地给出最大的偷窃金额。

相关问题