2026-10-27 23:41:13
本题是经典的动态规划问题,核心在于处理环形数组的限制条件,即首尾元素不能同时选取。以下是详细的解答:
解题思路偷第一家,不偷最后一家:此时问题转化为对数组 nums[0..n-2] 的线性打家劫舍。
不偷第一家,偷最后一家:此时问题转化为对数组 nums[1..n-1] 的线性打家劫舍。
状态定义:dp[i] 表示前 i 个房屋能偷到的最大金额。
状态转移:dp[i] = max(dp[i-1], dp[i-2] + nums[i-1]),即当前房屋的最大金额为“偷当前房屋+前前房屋的最大金额”与“不偷当前房屋,取前房屋的最大金额”中的较大值。
初始条件:dp[0] = 0(无房屋可偷),dp[1] = nums[0](仅第一家)。
情况1:包含第一家,排除最后一家。计算 dp[0..n-1](实际遍历到 n-2)。
情况2:排除第一家,包含最后一家。计算 dp[1..n](初始 dp[1] = 0,遍历到 n-1)。
初始化:dp 数组长度为 n+1,dp[1] 初始化为第一家的金额。
状态转移:遍历数组,更新 dp[i] 为“偷当前房屋”或“不偷当前房屋”的较大值。
情况1:调用 rob_linear 处理 nums[0..n-2](排除最后一家)。
情况2:调用 rob_linear 处理 nums[1..n-1](排除第一家)。
此方法通过分治策略将环形问题转化为两个线性子问题,确保首尾不同时被选中,同时利用动态规划高效求解,时间复杂度为 O(n),空间复杂度为 O(n)。