//337 树形
private Map<TreeNode, Integer> map = new HashMap<>();
public int rob(TreeNode root) {
if (root == null) {
return 0;
}
if (map.containsKey(root)) {
return map.get(root);
}
// 抢,然后去下下家
int doIt = root.val + (root.left == null ? 0 : rob(root.left.left) + rob(root.left.right)) + (root.right == null ? 0 : rob(root.right.left) + rob(root.right.right));
// 不抢,然后去下家
int notDoIt = rob(root.left) + rob(root.right);
int res = Math.max(doIt, notDoIt);
map.put(root, res);
return res;
}
//213 环形
public int rob2(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int n = nums.length;
if (n == 1) {
return nums[0];
} else if (n == 2) {
return Math.max(nums[0], nums[1]);
}
return Math.max(robHelper(nums, 0, n - 1), robHelper(nums, 1, n));
}
private int robHelper(int[] nums, int left, int right) {
//dp[i] 表示走到第i户,最大的金额
int[] dp = new int[nums.length];
dp[left] = nums[left];
dp[left + 1] = Math.max(nums[left], nums[left + 1]);
for (int i = left + 2; i < right; i++) {
//偷第i个,就只能偷i-2,不偷i,最大就是i-1
dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[right - 1];
}
//198
public int rob(int[] nums) {
int n = nums.length;
if (n == 1) {
return nums[0];
}
//dp[i] 表示走到第i户,最大的金额
int[] dp = new int[n];
dp[0] = nums[0];
dp[1] = Math.max(nums[0], nums[1]);
for (int i = 2; i < n; i++) {
//偷第i个,就只能偷i-2,不偷i,最大就是i-1
dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[n - 1];
}
打家劫舍合集
于 2024-05-10 20:57:46 首次发布