题目
解析
- 分析问题:从题意我们可以知道不能同时偷 0 和 最后一个房子
- 推导出:ans = max(helper(0, number.length - 2, number), helper(1, number.length - 1, number))
- helper 用于求出第 start 房子到第 end 房子能偷盗的最多财产
function getAns(number) {
// 先处理掉最简单的情况
if (number.length === 0) return 0;
if (number.length === 1) return number[1];
if (number.length === 2) return Math.max(number[0], number[1]);
// 处理复杂情况
const result1 = helper(0, number.length - 2, number);
const result2 = helper(1, number.length - 1, number);
return Math.max(result1, result2)
}
function helper(start, end, number) {
const dep = [number[start]] // dep[x] 表示从start家偷到第start家能偷盗的最多财产
dep[1] = Math.max(number[start], number[start + 1]) // 偷第 start 家偷到第 start + 1 家所能偷盗的最多财产
for( let i = start + 2; i <= end; i++) {
const j = i - start // 这主要是为了适配 result2 的情况,如果 start = 1 那么 i = 3 第三个结果存的位置应该是 dep[2] 却存到了 dep[3]
// dep[j] = Math.max(dep[j-1], dep[j - 2] + number[i])
dep[j%2] = Math.max(dep[(j-1)%2], dep[(j - 2)%2] + number[i]) // 空间优化,不理解的可以看看我写的爬楼梯问题,里面有对空间优化做解释
}
return dep[(end - start) % 2]
}
console.log(getAns([2, 3, 4, 5, 3])); // 偷最多的情况的偷第 2 和 4
后话
不知道今年要秋招的大家是什么心情,说句实话我是挺慌的,今年的互联网都说很难,现在能做的就是感觉做好充足的准备吧。对自己的要求:下周开始至少会有两道题的总结 上海浦东