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算法,留坑