337.打家劫舍 III
题目链接:337.打家劫舍 III
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
//参考:https://www.programmercarl.com/0337.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8DIII.html#%E6%80%9D%E8%B7%AF
class Solution {
public:
//记忆化递推
// int rob(TreeNode* root)
// {
// if(root==nullptr) return 0;
// //当前节点为叶子节点
// if(root->left==nullptr&&root->right==nullptr) return root->val;
// if(um[root]) return um[root];//如果um上有记录就返回即可
// //偷父节点
// int val1=root->val;
// if(root->left)
// val1+=rob(root->left->left)+rob(root->left->right);
// if(root->right)
// val1+=rob(root->right->left)+rob(root->right->right);
// //不偷父节点
// int val2=rob(root->left)+rob(root->right);
// um[root]=max(val1,val2);//对当前节点所求的和进行记忆
// return max(val1,val2);
// }
//动态规划
int rob(TreeNode* root)
{
vector<int> res=robTree(root);
return max(res[0],res[1]);
}
//长度为2的数组,0:不偷,1:偷
vector<int> robTree(TreeNode* cur)
{
if(cur==nullptr) return {0,0};
vector<int> left=robTree(cur->left);
vector<int> right=robTree(cur->right);
//偷cur,那么不能偷左右节点
int val1=cur->val+left[0]+right[0];
//不偷cur,那么可以偷也可以不偷左右节点,取较大的情况
int val2=max(left[0],left[1])+max(right[0],right[1]);
return {val2,val1};
}
private:
unordered_map<TreeNode*,int> um;
};