动态规划之环形房屋偷盗问题,js 解法和空间优化看这里!

103 阅读1分钟

题目

image.png

解析

  • 分析问题:从题意我们可以知道不能同时偷 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

后话

不知道今年要秋招的大家是什么心情,说句实话我是挺慌的,今年的互联网都说很难,现在能做的就是感觉做好充足的准备吧。对自己的要求:下周开始至少会有两道题的总结 上海浦东