leetcode213. 打家劫舍 II
程序员文章站
2022-07-12 08:51:21
...
题目: 在 198打家劫舍1 的题目基础上,规定所有房屋连成一个圈(首尾连接)
首先,首尾房间不能同时被抢,那么只可能有三种不同情况:
- 要么都不被抢;
- 要么第一间房子被抢最后一间不抢;
- 要么最后一间房子被抢第一间不抢。
所以整个问题变成:这三种情况,那种的结果最大 ? 最大的就是最终答案!不过,其实不需要比较三种情况,只要比较情况二和情况三就行了,因为第一种情况两个屋子都不抢:隐含的意思就是相当于没有两个屋子,可选择的屋子情况明显被后两种情况包含了。
注意的是:有可能两个屋子就是都没有抢,比如:1,4,0,4,1。但是没有被抢和不提供选择是两码事。robCore(nums, start, end) 是在[start,end]两者之间选择。
所以只要return :
max(robCore(nums, 0, nums.size() - 2),
robCore(nums, 1, nums.size() - 1));
把打家劫舍1的解法改成在区间内工作就可以了
public int rob(int[] nums) {
int len = nums.length;
if (len == 0) return 0;
if (len == 1) return nums[0];
return Math.max(rob_198(nums, 0, len - 2), rob_198(nums, 1, len - 1));
}
// 198题的代码 换成区间内有效就行了
int rob_198(int[] nums, int start, int end) {
if (end == start) return nums[start];
int dpLast = nums[start], dpPre = Math.max(nums[start], nums[start + 1]);
for (int i = start + 2; i <= end; ++i) {
int tmp = dpPre;
dpPre = Math.max(dpPre, dpLast + nums[i]);
dpLast = tmp;
}
return dpPre;
}
推荐阅读