每日一题算法:2020年8月5日 [打家劫舍 III] rob

2020年8月5日 打家劫舍 III rob

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int rob(TreeNode root) {

    }
}

解题思路:动态规划+递归+记录

我们编写一个递归算法,递归的规则是,我们输入某一间屋子的节点,然后得到该节点能够得到的最多的前是多少。
在这里插入图片描述

我们如果要得到最大值,我们先输入顶点,判断如果偷窃顶点的话,最大值是多少。如果不偷窃的话,最大值是多少。分别记录到两个数组中。

如果偷窃,那么直接跳过他的两个子节点的判断。

如果不偷窃,我们可以选择偷窃或者不偷窃下面两个节点。

偷窃的比较容易计算,可以直接得到3+1+3+1=8这个结果。

如果我们选择不偷窃定点,那么我们的最大值就是根节点的左节点和右节点进行判断,得到偷窃或者不偷窃这两个节点的最大值。

问题是我们如何记录每一个节点的值,用数组貌似没法记录,因为这是一颗二叉树。

解决方案:使用HashMap<Node,List>这个数据结构来存储。

代码部分:
在这里插入图片描述

HashMap<TreeNode, ArrayList<Integer>> map=new HashMap<>();
//代码块把0加上
{
    ArrayList<Integer> list=new ArrayList<>();
    //盗窃时等于本身
    list.add(0);
    //不盗窃时等于0
    list.add(0);
    map.put(null,list);
}
public int rob(TreeNode root) {
    if (root==null)
        return 0;
        
        rob(root.left);
        rob(root.right);
        ArrayList<Integer> list=new ArrayList<>();
        //盗窃时等于本身加上两个子节点不
        list.add(root.val+map.get(root.left).get(1)+map.get(root.right).get(1));
        //不盗窃时等于两个子节点中盗窃或者不盗窃的最大值之和
        list.add(Integer.max(map.get(root.left).get(0), map.get(root.left).get(1))+Integer.max(map.get(root.right).get(0), map.get(root.right).get(1)));
        map.put(root,list);
        return Integer.max(list.get(0),list.get(1));

}

实际上我们可以不使用List来存数据,可以简单地使用Integer和二叉树本身来分开存储,只不过那样代码写起来更复杂一些。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页