zoukankan      html  css  js  c++  java
  • [LintCode] House Robber III 打家劫舍之三

    The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night.

    Determine the maximum amount of money the thief can rob tonight without alerting the police.

     Example

      3
     /
    2   3
       
      3   1

    Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.

        3
       /
      4   5
     /   
    1   3   1

    Maximum amount of money the thief can rob = 4 + 5 = 9.

    LeetCode上的原题,请参见我之前的博客House Robber III

    解法一:

    class Solution {
    public:
        int houseRobber3(TreeNode* root) {
            unordered_map<TreeNode*, int> m;
            return helper(root, m);
        }
        int helper(TreeNode *root, unordered_map<TreeNode*, int> &m) {
            if (!root) return 0;
            if (m.count(root)) return m[root];
            int val = 0;
            if (root->left) {
                val += helper(root->left->left, m) + helper(root->left->right, m);
            }
            if (root->right) {
                val += helper(root->right->left, m) + helper(root->right->right, m);
            }
            val = max(val + root->val, helper(root->left, m) + helper(root->right, m));
            m[root] = val;
            return val;
        }
    };

    解法二:

    class Solution {
    public:
        int houseRobber3(TreeNode* root) {
            vector<int> res = helper(root);
            return max(res[0], res[1]);
        }
        vector<int> helper(TreeNode *root) {
            if (!root) return {0, 0};
            vector<int> left = helper(root->left);
            vector<int> right = helper(root->right);
            vector<int> res{0, 0};
            res[0] = max(left[0], left[1]) + max(right[0], right[1]);
            res[1] = left[0] + right[0] + root->val;
            return res;
        }
    };
  • 相关阅读:
    Python连接redis时要注意的点
    Python SQLAlchemy多对多外键关联时表结构
    SQLAlchemy中解决数据库访问时出现的Incorrect string value: xxx at row 484
    HDFS集群数据不均衡处理
    elasticsearch数据过期删除处理
    docker使用技巧小记
    kubeadm部署kubernetes-1.12.0 HA集群-ipvs
    k8s全栈监控之metrics-server和prometheus
    k8s小工具
    k8s集群之上游dns--dnsmasq,统一管理kubernetes的dns解析
  • 原文地址:https://www.cnblogs.com/grandyang/p/5445661.html
Copyright © 2011-2022 走看看