一、标准动归
class Solution {
public int rob(int[] nums) {
int n=nums.length;
if(n==1){
return nums[0];
}
if(n==2){
return Math.max(nums[0],nums[1]);
}
int[] dp=new int[n];
dp[0]=nums[0];
dp[1]=Math.max(nums[0],nums[1]);
for(int i=2;i<n;i++){
dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);
}
return dp[n-1];
}
}
二、环形数组
class Solution {
public int rob(int[] nums) {
int n=nums.length;
if(n==1) return nums[0];
return Math.max(rob(nums,0,n-2),rob(nums,1,n-1));
}
public int rob(int[] nums,int left,int right){
int n=right-left+1;
if(n==1){
return nums[left];
}
if(n==2){
return Math.max(nums[left],nums[left+1]);
}
int[] dp=new int[n];
dp[0]=nums[left];
dp[1]=Math.max(nums[left],nums[left+1]);
for(int i=2;i<n;i++){
dp[i]=Math.max(dp[i-2]+nums[i+left],dp[i-1]);
}
return dp[n-1];
}
}
三、二叉树
class Solution {
HashMap<TreeNode,Integer> memo=new HashMap<>();
public int rob(TreeNode root) {
if(root==null) return 0;
if(memo.containsKey(root)){
return memo.get(root);
}
int do_it=root.val+(root.left==null?0:rob(root.left.left)+rob(root.left.right))+(root.right==null?0:rob(root.right.left)+rob(root.right.right));
int not_do=rob(root.left)+rob(root.right);
int res=Math.max(do_it,not_do);
memo.put(root,res);
return res;
}
}