小偷第三题
/* 一开始的想法是dfs先左树,然后右树在遍历完左树的基础上叠加,这么做的原因是一开始觉得左右孩子相互没有影响,但是后来 做出来发现不对,才看出来左孩子是对右孩子有影响的,比如没用左孩子,用的父节点,这时候右孩子是用不了父节点的,所以 遍历完左子树后,右边子树节点有的已经不能用了。 看了看网上的答案,是用一个数组存取当前节点用和不用两种情况得到的结果 先不管当前node用不用,把左右子树各自两种情况求出来,如果当前节点不用就直接判断大小相加,如果当前节点用, 左右孩子就只能不用。 */ public int rob(TreeNode root) { int[] res = dp(root); return Math.max(res[0],res[1]); } private int[] dp(TreeNode root) { if (root==null) return new int[2]; int[] l = dp(root.left); int[] r = dp(root.right); int[] cur = new int[2]; //不用当前节点 cur[0] = Math.max(l[0],l[1]) + Math.max(r[0],r[1]); //用当前节点 cur[1] = l[0] + r[0] + root.val; return cur; }
list的add(index,val)方法相当于插入,要修改某个地方用set,这和map的put不一样,map的put之后就直接覆盖了。