日常刷题0x11之德玛蹲草丛

118 阅读1分钟

此阶段给自己定的目标是:做过的这些题每天坚持继续刷二遍,每道题做过之后开始尝试多解法尝试解题。上一阶段是感知都有什么题目,此阶段主要系统化常规题解套路知识,牢记牢记此阶段目的。

题号:198
var rob = function (nums) {
    let dptable = new Array(nums.length).fill(0)
    for (let i = 0; i < dptable.length; i++) {
        let arr = new Array(2)
        dptable[i] = arr
    }
    let result = 0
    for (let i = 0; i < nums.length; i++) {
        if (i == 0) {
            dptable[i][0] = 0
            dptable[i][1] = nums[i]
        } else {
            //站在当前房子面前做决策:选则抢或者不抢
            dptable[i][0] = Math.max(dptable[i - 1][0], dptable[i - 1][1])
            dptable[i][1] = dptable[i - 1][0] + nums[i]
        }

        result = Math.max(Math.max(dptable[i][0], dptable[i][1]), result)
    }
    return result
};
题号:213

var rob = function (nums) {
    //一开始table设计为二维导致最后一个的决策会牵连到首次的决策,此时判断首次的决策选还是不选都不行
    //分开来讨论首次抢或者不抢那么后续的决策就不会再影响到前面
    //第一个抢
    let table1 = new Array(nums.length)
    for (let i = 0; i < nums.length; i++) {
        if (i == 0) {
            table1[i] = nums[0]
        } else if (i == 1) {
            //第二个就不能抢
            table1[i] = table1[i - 1]
        } else if (i == nums.length - 1) {
            // 最后一个也不能抢
            table1[i] = table1[i - 1]
        } else {
            table1[i] = Math.max(nums[i] + table1[i - 2], table1[i - 1])
        }
    }

    //第一个不偷
    let table2 = new Array(nums.length)
    for (let i = 0; i < nums.length; i++) {
        if (i == 0) {
            table2[i] = 0
        } else if (i == 1) {
            table2[i] = nums[i]
        } else {
            table2[i] = Math.max(nums[i] + table2[i - 2], table2[i - 1])
        }
    }
    return Math.max(table1[nums.length - 1], table2[nums.length - 1])
};
题号:337
var rob = function (root) {
    let helper = (node) => {
        let result = new Array(2).fill(0)
        if (node == null) {
            return new Array(2).fill(0)
        }
        //当前节点要么偷要么不偷
        let leftResult = helper(node.left)
        let rightResult = helper(node.right)
        //当前节点偷,其儿子节点不能偷
        let num1 = node.val + leftResult[0] + rightResult[0]
        //当前节点不偷,儿子节点可偷(是可偷可不偷)
        let num0 = Math.max(leftResult[0], leftResult[1]) + Math.max(rightResult[0], rightResult[1])
        return [num0, num1]
    }
    let result = helper(root)
    return Math.max(result[0], result[1])
};