LeetCode 337. House Robber III

一开始以为不直接连接的话就考虑隔层加钱,偶数层和奇数层分开算得两个结果,但是输入为[4,1,null,2,null,null,3]时最大值为4+3 = 7,4是第0层,3是3层。

因此要以节点为对象,而不是层。每个节点的情况分两种,抢和不抢,如果抢当前节点,那么左右节点不能抢;如果不抢,那么当前节点所得钱数为max(左抢,左不抢) + max(右抢,右不抢),注意不是左抢+右抢,不然上述的输入还是过不了。用递归实现。

12ms

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     void helpRob(TreeNode* root, int& in, int& out){
13         if(!root) return;
14         int lin = 0, lout = 0, rin = 0, rout = 0;
15         helpRob(root->left, lin, lout);
16         helpRob(root->right, rin, rout);
17         in = lout + rout + root->val;
18         out = max(lin, lout) + max(rin, rout);
19     }
20     int rob(TreeNode* root) {
21         if(!root) return 0;
22         int in = 0, out = 0;
23         helpRob(root, in, out);
24         return max(in, out);
25     }
26 };

还有8ms算法,留坑

posted @ 2016-04-12 20:38  co0oder  阅读(127)  评论(0编辑  收藏  举报