打家劫舍 II
环形线性 DP 经典题:把首尾相邻约束拆成两段线性打家劫舍来做。
#resource / algorithm
#type / snippet
#status / growing
#source / leetcode
#algo / dp
打家劫舍 II
题目链接:https://leetcode.cn/problems/house-robber-ii/
核心变化
房子围成一圈,所以第一个房子和最后一个房子不能同时偷。
关键拆分
环形不好直接做,但可以拆成两种情况:
- 偷的范围是
[0, n - 2] - 偷的范围是
[1, n - 1]
分别做一次线性打家劫舍,取最大值即可。
JavaScript
var rob = function(nums) {
const n = nums.length;
if (n === 1) return nums[0];
function robLine(arr) {
let prev2 = 0;
let prev1 = 0;
for (const x of arr) {
const cur = Math.max(prev1, prev2 + x);
prev2 = prev1;
prev1 = cur;
}
return prev1;
}
return Math.max(robLine(nums.slice(0, n - 1)), robLine(nums.slice(1)));
};