打家劫舍 LeetCode 198
题目链接:[LeetCode 198 - 中等]
思路
动态规划的具体思路如下:
①主要将数组分为偷与不偷:偷的放在dp[i][0]中,不偷的放在dp[i][1]中
②遍历顺序:没有很清晰的遍历顺序
动态规划:
class Solution {
public int rob(int[] nums) {
int[][] dp = new int[nums.length][2];
dp[0][0]=nums[0];
dp[0][1]=0;
for(int i=1;i<nums.length;i++){
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+nums[i]);
dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]);
}
return Math.max(dp[nums.length-1][0],dp[nums.length-1][1]);
}
}
打家劫舍 II LeetCode 213
题目链接:[LeetCode 213 - 中等]
思路
主要是计算偷第一个房屋还是偷最后一个,其余的与#198没有区别
动态规划:
class Solution {
public int rob(int[] nums) {
int len = nums.length;
if(len==1)return nums[0];
return Math.max(robHelper(0,len-1,nums),robHelper(1,len,nums));
}
int robHelper(int start,int end,int[] nums){
int x=0,y=0,z=0;
for(int i=start;i<end;i++){
y=z;
z=Math.max(y,x+nums[i]);
x=y;
}
return z;
}
}
打家劫舍 III LeetCode 337
题目链接:[LeetCode 337 - 中等]
思路
当时想的时候只考虑了int,而没有考虑int数组。但是采用的方式差不多,都是后序遍历。
动态规划:
class Solution {
public int rob(TreeNode root) {
int[] res = robHelper(root);
return Math.max(res[0],res[1]);
}
private int[] robHelper(TreeNode root){
int[] res = new int[2];
if(root==null)return res;
int[] left = robHelper(root.left);
int[] right = robHelper(root.right);
res[0]=Math.max(left[0],left[1])+Math.max(right[0],right[1]);
res[1]=root.val+left[0]+right[0];
return res;
}
}