题意:
给定一棵二叉树,不能偷窃相邻的节点,问最大偷窃金额是多少?
方法一:
动态规划
思路:动态规划。
状态转移方程:
首先,mp1,mp2分别表示当前节点偷或不偷的最大金额;后序遍历+动态规划得到每个节点的偷或不偷的最大金额。
class Solution { public: unordered_map<TreeNode*,int> mp1,mp2;//mp1,mp2分别表示当前节点偷或不偷的最大金额 int rob(TreeNode* root) { f(root);//递归 return max(mp1[root],mp2[root]);//返回最大值 } void f(TreeNode* root){//递归 if(root==nullptr) return; f(root->left);//左递归 f(root->right);//右递归 mp1[root]=root->val+mp2[root->left]+mp2[root->right];//当前节点偷 mp2[root]=max(mp1[root->left],mp2[root->left])+max(mp1[root->right],mp2[root->right]);//当前节点不偷 } };
时间复杂度:空间复杂度:
方法二:
java
思路:状态转移方程:
import java.util.*; public class Solution { //mp1,mp2分别表示当前节点偷或不偷的最大金额 HashMap<TreeNode,Integer> mp1=new HashMap(); HashMap<TreeNode,Integer> mp2=new HashMap(); public int rob (TreeNode root) { mp1.put(null,0); mp2.put(null,0); f(root);//递归 return Math.max(mp1.get(root),mp2.get(root));//返回最大值 } void f(TreeNode root){//递归 if(root==null) return; f(root.left);//左递归 f(root.right);//右递归 mp1.put(root,root.val+mp2.get(root.left)+mp2.get(root.right));//当前节点偷 mp2.put(root,Math.max(mp1.get(root.left),mp2.get(root.left))+Math.max(mp1.get(root.right),mp2.get(root.right)));//当前节点不偷 } }
时间复杂度:空间复杂度: