● 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或2
int 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;
}
}