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;}}
