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