代码随想录算法训练营第四十八天 | 背包问题:打家劫舍

文章目录

  • 背包问题:打家劫舍
    • 题目
    • 对题目的想法
    • 实现中/后的感想

背包问题:打家劫舍

题目

198.打家劫舍
213.打家劫舍II
337.打家劫舍 III

对题目的想法

第一题看起来很容易,比较轻松过了,不过环形和二叉树想了许久没有什么思路。

实现中/后的感想

  1. 第一题下标出了点小问题。一般dp数组的定义是int[] dp = new int[nums.length + 1],返回值是dp[nums.length]所以dp[1]对应着nums[0]。
  2. 环形掐头去尾遍历两次的想法很巧妙,这个处理想到了分糖果里的两次遍历,虽然实际思路并不相同。
  3. 二叉树花了最多时间:
    • 最先尝试后序遍历,虽然自己没有意识到这是后序遍历。但是迭代的过程比较犯难,因为在犹豫如何传递参数。总想着把本节点之前的值也传入,但如此一来遍历到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]};

你可能感兴趣的:(算法)