当前位置: 代码迷 >> 综合 >> LeetCode213. 打家劫舍 II(Java,动态规划)
  详细解决方案

LeetCode213. 打家劫舍 II(Java,动态规划)

热度:93   发布时间:2023-12-19 03:16:08.0

1.问题

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

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

示例 1:

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

力扣(LeetCode);

2.方法

动态规划问题,由于房屋是连成圈的,可以根据,打劫第一家和不打劫第一家分开进行讨论,并取最大值。

class Solution {public int helper(int[] nums){int res = Integer.MIN_VALUE;int ppre = 0;int pre = 0;int cur = 0;for(int i = 0; i<nums.length; i++){cur = Math.max(ppre + nums[i], pre);ppre = pre;pre = cur;res = Math.max(cur, res);}return res;}public int rob(int[] nums) {if(nums.length == 0) return 0;if(nums.length == 1) return nums[0];int res1 = helper(Arrays.copyOfRange(nums, 0, nums.length-1));int res2 = helper(Arrays.copyOfRange(nums, 1, nums.length));    return Math.max(res1, res2);}
}
  相关解决方案