背包问题:打家劫舍
题目
198.打家劫舍
213.打家劫舍II
337.打家劫舍 III
对题目的想法
第一题看起来很容易,比较轻松过了,不过环形和二叉树想了许久没有什么思路。
实现中/后的感想
- 第一题下标出了点小问题。一般dp数组的定义是
int[] dp = new int[nums.length + 1]
,返回值是dp[nums.length]
所以dp[1]对应着nums[0]。 - 环形掐头去尾遍历两次的想法很巧妙,这个处理想到了分糖果里的两次遍历,虽然实际思路并不相同。
- 二叉树花了最多时间:
- 最先尝试后序遍历,虽然自己没有意识到这是后序遍历。但是迭代的过程比较犯难,因为在犹豫如何传递参数。总想着把本节点之前的值也传入,但如此一来遍历到null节点时处理就很麻烦。
- 第一种解法后序遍历每个Node中,可以用一个map储存已经遍历过的节点。这里null节点或者枝叶节点不用储存因为他们的返回值很直接不用额外计算。此外储存的时候是在退出当前递归层前存储。
- 在第二种解法里,如果不偷本层,那么下一层既可以偷也可以不偷。这一点没有想到。
return new int[]{Math.max(left[0], left[1]) + Math.max(right[0], right[1]), r.val + left[0] + right[0]};