打家劫舍(DP问题)
1. 针对问题
LeetCode198 -- https://leetcode.cn/problems/house-robber/
LeetCode213 -- https://leetcode.cn/problems/house-robber-ii/
2. 分析问题
213 是在198的基础上进行变形的,我们需要了解一下变形的规则
213的首尾不能相连,可以拆解成求198问题的(0, len - 2) 和(1, len - 1)两段的最大值。
3. 代码解答
198:
class Solution { public int rob(int[] nums) { int len = nums.length; if(len == 1) return nums[0]; if(len == 2) return Math.max(nums[0], nums[1]); int[] dp = new int[len]; dp[0] = nums[0]; dp[1] = Math.max(nums[0], nums[1]); for(int i = 2; i < len; i++) { dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]); } return Math.max(dp[len - 1], dp[len - 2]); } }
213:
class Solution { public int rob(int[] nums) { int len = nums.length; if(len == 1) return nums[0]; if(len == 2) return Math.max(nums[0], nums[1]); return Math.max(robSub(nums, 0, len - 2), robSub(nums, 1, len - 1)); } int robSub(int[] nums, int l, int r) { if(r - l == 1) return Math.max(nums[l], nums[r]); int[] dp = new int[r - l + 1]; dp[0] = nums[l]; dp[1] = Math.max(nums[l], nums[l + 1]); for(int i = 2; i <= (r - l); i++) { dp[i] = Math.max(dp[i - 2] + nums[l + i], dp[i - 1]); } return Math.max(dp[r - l], dp[r - l - 1]); } }

浙公网安备 33010602011771号