zoukankan      html  css  js  c++  java
  • 337. House Robber III

    小偷第三题

    /*
        一开始的想法是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之后就直接覆盖了。

  • 相关阅读:
    数据结构总结(UPDATING......)
    课件例题4.11,4.12
    Luogu P1525 关押罪犯
    Luogu P1540 机器翻译
    Luogu P1313 计算系数
    Luogu P1311 选择客栈
    Luogu P1519 穿越栅栏 Overfencing
    Luogu P2863 [USACO06JAN]牛的舞会The Cow Prom
    Tarjan学习笔记
    Luogu P3393 逃离僵尸岛
  • 原文地址:https://www.cnblogs.com/stAr-1/p/8372318.html
Copyright © 2011-2022 走看看