代码随想录算法训练营第四十八天 | 打家劫舍
● 今日学习的文章链接和视频链接
● 看到题目的第一想法
打家劫舍大礼包
● 看完代码随想录之后的想法
分别讲了基本实现,环路套用,树的DP
● 实现过程中遇到哪些困难
树的DP还是不太理解,基本上知道是后序遍历
● 解题代码
-
点击查看代码
class Solution { public int rob(int[] nums) { if(nums.length == 0) return 0; if(nums.length == 1) return nums[0]; int[] dp = new int[nums.length]; dp[0] = nums[0]; dp[1] = Math.max(nums[0],nums[1]); for (int i = 2; i < nums.length; i++) { dp[i] = Math.max(dp[i - 2] + nums[i],dp[i - 1]); } return dp[nums.length-1]; } } -
点击查看代码
class Solution { public int rob(int[] nums) { //这道题不好判断环,可以另辟蹊径 //即分成两个部分 一个去掉首部 一个去掉尾部 找到这两个的MAX,判断去掉那个更好 if(nums.length == 0) return 0; if(nums.length == 1) return nums[0]; int result1 = robR(nums,0,nums.length-2); int result2 = robR(nums,1,nums.length-1); return Math.max(result1,result2); } public int robR(int[]nums,int begin,int end){ if(begin == end) return nums[begin]; int[] dp = new int[nums.length]; dp[begin] = nums[begin]; dp[begin + 1] = Math.max(nums[begin],nums[begin + 1]); for (int i = begin + 2; i <= end; i++) { dp[i] = Math.max(dp[i - 2] + nums[i],dp[i - 1]); } return dp[end]; } } -
点击查看代码
class Solution { public int rob(TreeNode root) { int[] result = robTree(root); return Math.max(result[0], result[1]); } public int[] robTree(TreeNode root){ if(root == null) return new int[]{0,0}; int[] left = robTree(root.left); int[] right = robTree(root.right); // 偷cur,那么就不能偷左右节点。 int val1 = root.val + left[0] + right[0]; // 不偷cur,那么可以偷也可以不偷左右节点,则取较大的情况 int val2 = Math.max(left[0], left[1]) + Math.max(right[0], right[1]); return new int[]{val2, val1}; } }
● 今日收获,学习时长
今日收获:学习了树的DP
学习时长:1h
浙公网安备 33010602011771号