美文网首页
House Robber III

House Robber III

作者: 我叫胆小我喜欢小心 | 来源:发表于2017-05-03 18:55 被阅读7次

    题目来源
    还是房屋抢劫的问题,不过这次改成了二叉树抢劫。
    然后我不会!!!
    看了下答案,最简单的方法就是比较所有情况,深度搜索。
    代码如下:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int rob(TreeNode* root) {
            if (root == NULL)
                return 0;
            int val = 0;
            if (root->left)
                val += rob(root->left->left) + rob(root->left->right);
            if (root->right)
                val += rob(root->right->left) + rob(root->right->right);
            return max(root->val + val, rob(root->left) + rob(root->right));
        }
    };
    

    这种时间复杂度比较高。然后进一步的改进方法呢,实际上用到了DP。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int rob(TreeNode* root) {
            vector<int> res;
            res = subRob(root);
            return max(res[0], res[1]);
        }
        
        vector<int> subRob(TreeNode* node)
        {
            if (node == NULL)
                return vector<int>{0, 0};
            vector<int> left = subRob(node->left);
            vector<int> right = subRob(node->right);
            vector<int> res(2, 0);
            res[0] = max(left[0], left[1]) + max(right[0], right[1]);
            res[1] = node->val + left[0] + right[0];
            return res;
        }
    };
    

    相关文章

      网友评论

          本文标题:House Robber III

          本文链接:https://www.haomeiwen.com/subject/ssqltxtx.html