198.打家劫舍(简单)
题目:192.打家劫舍
两种情况:偷或是不偷
dp[i],第i户,对应金额是nums[i-1]
不偷:dp[i]=dp[i-1]
偷:dp[i]=dp[i-2]+nums[i-1]
class Solution {
public int rob(int[] nums) {
int n=nums.length;
int[] dp=new int[n+1];
dp[1]=nums[0];
for(int i=2;i<=n;i++){
dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i-1]);
}
return dp[n];
}
}
213.打家劫舍II(中等)
题目:213. 打家劫舍 II
这个地方所有的房屋都 围成一圈
class Solution {
public int rob(int[] nums) {
int n=nums.length;
if(n==1) return nums[0];
int[] dp=new int[n];
//偷第一户,nums[0]~nums[n-2]
dp[1]=nums[0];
for(int i=2;i<n;i++){
dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i-1]);
}
int res=dp[n-1];
//不偷第一户,nums[1]~nums[n-1]
dp[1]=nums[1];
for(int i=2;i<n;i++){
dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);
}
res=Math.max(res,dp[n-1]);
return res;
}
}
337.打家劫舍III(中等)
题目:337.打家劫舍III
树状偷
ans[0]不偷当前节点
ans[1]偷当前节点
class Solution {
public int rob(TreeNode root) {
int[] ans=dfs(root);
return Math.max(ans[0],ans[1]);
}
public int[] dfs(TreeNode root){
if(root==null){
return new int[]{0,0};
}
int[] left=dfs(root.left);
int[] right=dfs(root.right);
int[] ans=new int[2];
ans[0]=Math.max(left[0],left[1])+Math.max(right[0],right[1]); //注意此处
ans[1]=root.val+left[0]+right[0];
return ans;
}
}