leetcode 213. 打家劫舍 II

    科技2025-11-13  7

    你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

    给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

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

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/house-robber-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 采用动态规划的方法去处理:采取分情况处理的方式,分别判断0-N-1的最大值,以及1-N的最大值,区两种情况的最大值作为输出;

    int rob1(int* nums, int numsSize){ if (numsSize == 0) { return 0; } if (numsSize == 1) { return nums[0]; } int max, pre, res = 0; pre = 0; max = nums[0]; for (int i = 2; i <= numsSize; i++) { res = fmax(max, pre + nums[i - 1]); pre = max; max = res; } return res; } int rob(int* nums, int numsSize){ if (numsSize == 0) { return 0; } if (numsSize == 1) { return nums[0]; } int res = 0; int *ans = (int *)malloc(sizeof(int) * (numsSize - 1)); for (int i = 0; i < numsSize - 1; i++) { ans[i] = nums[i]; } res = fmax(res, rob1(ans, numsSize - 1)); for (int i = 0; i < numsSize - 1; i++) { ans[i] = nums[i + 1]; } res = fmax(res, rob1(ans, numsSize - 1)); return res; } class Solution: def rob(self, nums: List[int]) -> int: def calc(nums:List[int]) -> int: n = len(nums) if n == 0: return 0 if n == 1: return nums[0] ans = 0 preVal, maxVal = 0, nums[0] for i in range(2, n + 1): ans = max(maxVal, preVal + nums[i - 1]) preVal = maxVal maxVal = ans return ans res = 0 n = len(nums) if n == 0: return 0; if n == 1: return nums[0] ans = [0 for i in range(n)] for i in range(n - 1): ans[i] = nums[i] res = max(res, calc(ans)) for i in range(n - 1): ans[i] = nums[i + 1] res = max(res, calc(ans)) return res
    Processed: 0.010, SQL: 8