198 打家劫舍
https://leetcode.cn/problems/house-robber/ 抢或不抢两种状态相互制约的推导关系。
class Solution {
public int rob(int[] nums) {
int pick = nums[0];
int unpick = 0;
for (int i = 1; i < nums.length; i++) {
int temp = pick;
pick = unpick + nums[i];
unpick = Math.max(unpick, temp);
}
return Math.max(pick, unpick);
}
}
213 打家劫舍II
https://leetcode.cn/problems/house-robber-ii/ 成环后第一家和最后一家不能同时抢,于是把可能的情况分为第一家一定不抢 + 最后一家一定不抢的情况。
class Solution {
public int rob(int[] nums) {
if (nums.length == 0) return 0;
if (nums.length == 1) return nums[0];
return Math.max(rob(nums, 0, nums.length - 2), rob(nums, 1, nums.length - 1));
}
private int rob(int[] nums, int start, int end) {
int pick = nums[start];
int unpick = 0;
for (int i = start + 1; i <= end; i++) {
int temp = pick;
pick = unpick + nums[i];
unpick = Math.max(unpick, temp);
}
return Math.max(pick, unpick);
}
}
337打家劫舍III
https://leetcode.cn/problems/house-robber-iii/ multi return value recursion,把抢或不抢根节点放在return里。
class Solution {
public int rob(TreeNode root) {
int[] result = robTree(root);
return Math.max(result[0], result[1]);
}
private int[] robTree(TreeNode root) {
if (root == null) return new int[]{0, 0};
int[] leftResult = robTree(root.left);
int[] rightResult = robTree(root.right);
return new int[]{root.val + leftResult[1] + rightResult[1], Math.max(leftResult[0], leftResult[1]) + Math.max(rightResult[0], rightResult[1])};
}
}