文章目录
- ● 198.打家劫舍
- 思路
- 代码
- 1.dp数组
- 两个变量
- ● 213.打家劫舍II
- 思路:
- 代码
- ● 337.打家劫舍III
- 思路
- 代码:
● 198.打家劫舍
思路
代码
1.dp数组
class Solution {public int rob(int[] nums) {if(nums.length==1)return nums[0];int[] dp=new int[nums.length];dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);for(int i=2;i<nums.length;i++){dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);}return dp[nums.length-1];}
}
两个变量
class Solution {public int rob(int[] nums) {if(nums.length==1)return nums[0];// int[] dp=new int[nums.length];// dp[0]=nums[0];// dp[1]=Math.max(nums[0],nums[1]);int a=nums[0],b=Math.max(nums[0],nums[1]);int c=0;for(int i=2;i<nums.length;i++){c=Math.max(a+nums[i],b);a=b;b=c;}return b;}
}
● 213.打家劫舍II
思路:
考虑首部0到n-1或者1到n尾部。两种情况
代码
class Solution {public int rob(int[] nums) {// 2 n // 1 n-1 差为n-2或2int n=nums.length;if(n==0)return 0;if(n==1)return nums[0];int l=rob2(nums,0,n-1);int r=rob2(nums,1,n);return Math.max(l,r);}public int rob2(int[] nums,int l,int r) {int a=0,b=0,c=0;for(int i=l;i<r;i++){//i和 c=Math.max(b,a+nums[i]);a=b;b=c;}return b;}
}
● 337.打家劫舍III
思路
dp[0]不偷 dp[1]偷
代码:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public int rob(TreeNode root) {int[] res = rob3(root);return Math.max(res[0], res[1]);}// 后序遍历public int[] rob3(TreeNode root) {int[] res = new int[2];if(root==null)return res;//空则返回{0,0}int[] left=rob3(root.left);int[] right=rob3(root.right);// 偷:左孩子不偷+ 右孩子不偷 + 当前节点偷res[1]=root.val+left[0]+right[0];//当前节点不偷// 不偷:Max(左孩子不偷,左孩子偷) + Max(右孩子不偷,右孩子偷)// root[0] = Math.max(rob(root.left)[0], rob(root.left)[1]) +// Math.max(rob(root.right)[0], rob(root.right)[1])res[0]=Math.max(left[0],left[1])+Math.max(right[0],right[1]);return res;}
}