赞
踩
动规五部曲
dp[i]
代表走到下标 i
能偷的最大金额数,考虑下标i
(包括i
)以内的房屋,最多可以偷窃的金额为dp[i]
dp[nums.length-1]
**i**
的情况:此时 dp[i] 考虑 nums[i] + dp[i-2]
**i**
的情况:**此时 dp[i] 考虑 nums[i-1]dp[i] = Math.max(nums[i] + dp[i-2],dp[i-1])
dp[0] = nums[0]
,此时只有 0 因为是最大值,所以 0 必须偷dp[1] = Math.max(nums[0],nums[1])
,此时选取二者最大的i
是由 i-2
和 i-1
决定的,因此必须从小到大遍历i
从 2
遍历到 nums.size()
class Solution { public int rob(int[] nums) { if(nums==null && nums.length==0) return 0; if(nums.length == 1 ) return nums[0]; // 1. 创建dp数组,即含义 int[] dp = new int[nums.length]; // 2. 确定递推公式 // dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]) // 3. dp 数组初始化 dp[0] = nums[0]; dp[1] = Math.max(nums[0],nums[1]); // 4. 确定遍历顺序 for(int i = 2 ; i < nums.length;i++){ dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]); } return dp[nums.length-1]; } }
分情况讨论
动规五部曲
dp[i] = Math.max(nums[i] + dp[i-2],dp[i-1])
i
是由 i-2
和 i-1
决定的,因此必须从小到大遍历i
从 2
遍历到 nums.size()
class Solution { public int rob(int[] nums) { if(nums==null || nums.length ==0) return 0; if(nums.length == 1) return nums[0]; int[] nums1 = new int[nums.length-1]; int[] nums2 = new int[nums.length-1]; int index = 0; for(int i = 0 ; i <= nums.length-2;i++){ nums1[index++] = nums[i]; } index = 0; for(int i = 1 ; i <= nums.length-1;i++){ nums2[index++] = nums[i]; } int res1 = rob1(nums1); int res2 = rob1(nums2); return Math.max(res1,res2); } public int rob1(int[] nums){ if(nums==null || nums.length ==0) return 0; if(nums.length == 1) return nums[0]; // 1.创建 dp 数组 int[] dp = new int[nums.length]; // 2.递推公式 // dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]); // 3. 初始化 dp[0] = nums[0]; dp[1] = Math.max(nums[0],nums[1]); // 4. 遍历 for(int i = 2 ; i < nums.length;i++){ dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]); } return dp[nums.length-1]; } }
思路
确定 dp 数组含义
递归三部曲(后续遍历二叉树)
**TreeNode root**
: 递归函数参数class Solution { public int rob(TreeNode root) { int[] res = Traversal(root); return Math.max(res[0],res[1]); } int[] Traversal(TreeNode root){ if(root==null){ return new int[]{0,0}; } // 定义 dp 数组 int[] dp = new int[2]; int[] left = Traversal(root.left); int[] right = Traversal(root.right); // 不偷 dp[0] = Math.max(left[0],left[1])+ Math.max(right[0],right[1]); // 偷 dp[1] = root.val + left[0] + right[0]; return dp; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。