美文网首页
house-robber-iii

house-robber-iii

作者: 克罗地亚催眠曲 | 来源:发表于2018-08-15 10:15 被阅读8次

    这道题略有难度,题目链接。题目要求就是求一个二叉树所有节点数值的和的最大值,条件是有边连接的两个节点不能被同时选中。一开始没什么思路,在网上看了别人的思路之后(并没有参考别人的代码),知道了用动态规划的思想(?我也不确定这是不是动态规划的算法)。
    代码思路为:从root开始遍历,有两种可能的情况,包含root节点但不包含root的左孩子节点和右孩子节点,第二种情况是不包含root节点但包含root的左孩子节点和右孩子节点。故使用一个max就可以解决这个问题。为了把之前已经计算过的节点的子树的最大值保存起来,在类里使用了一个map私有变量。注意这个map变量不能放在dfs中作为static变量,一开始我是这么做的。后来发现这种情况下行不通,因为leetcode平台测试的时候应该是生成了多个Solution类的实例,会导致前几个测试用例可以通过,大概从第四个开始就报错。一开始我很不理解为什么会报错,因为相同的用例我用run code的时候输出的结果是正确的,commit的时候就会报错。最后发现是这个私有static变量的问题。贴出代码如下

    class Solution {
    public:
        map<TreeNode*, int> m;
        int rob(TreeNode* root) {
            return dfs(root);
        }
        
        int dfs(TreeNode* root) {
            if(!root)
                return 0;
            if(m.find(root) == m.end()) {
                int left = root->left == NULL ?  0 : (dfs(root->left->left) + dfs(root->left->right));
                int right = root->right == NULL ? 0 : (dfs(root->right->left) + dfs(root->right->right));
                
                m[root] = root->val + (left) + (right);
                cout << root->val << "\t" << m[root] << endl;
            }
            return max(m[root], dfs(root->left) + dfs(root->right));
        }
    };
    

    相关文章

      网友评论

          本文标题:house-robber-iii

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