当前位置:   article > 正文

训练营四十八天 | 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

训练营四十八天 | 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍  

不要忘记空数组和数组长度为1的情况单独考虑

和前两个状态有关

代码随想录

  1. class Solution {
  2. public int rob(int[] nums) {
  3. if(nums == null && nums.length == 0) return 0;
  4. if(nums.length == 1) return nums[0];
  5. int[] dp = new int[nums.length];
  6. //int[] dp = new int[2];
  7. dp[0] = nums[0];//和前两个状态有关 所以初始化前两个0和1
  8. dp[1] = Math.max(nums[0], nums[1]);
  9. //int res;
  10. for(int i = 2; i < nums.length; i++) {
  11. dp[i] = Math.max(dp[i-1], dp[i-2] + nums[i]);//考虑前一个与考虑前两个
  12. //res = Math.max(dp[1], dp[0] + nums[i]);
  13. //dp[0] = dp[1];
  14. //dp[1] = res;
  15. }
  16. return dp[nums.length - 1];
  17. //return res;
  18. }
  19. }

 213.打家劫舍II  

考虑两种情况

只考虑首或者只考虑尾

代码随想录

  1. class Solution {
  2. public int rob(int[] nums) {
  3. if (nums == null || nums.length == 0)
  4. return 0;
  5. if (nums.length == 1)
  6. return nums[0];
  7. int num1 = robNum(nums, 0, nums.length - 1);//只考虑头不考虑尾
  8. int num2 = robNum(nums, 1, nums.length);//不考虑头只考虑尾
  9. return Math.max(num1, num2);//两者取最大
  10. }
  11. public int robNum(int[] nums, int start, int end) {
  12. int x = 0, y = 0, z = 0;
  13. for(int i = start; i < end; i++) {
  14. z = Math.max(y, x + nums[i]);
  15. x = y;
  16. y = z;
  17. }
  18. return z;
  19. }
  20. }

 337.打家劫舍III  

好难

二叉树 后序遍历 递归

递归三部曲:1.参数和返回值 2.终止条件 3.单层递归逻辑

代码随想录

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public int rob(TreeNode root) {
  18. int[] res = robAction(root);
  19. return Math.max(res[0], res[1]);//取大值
  20. }
  21. public int[] robAction(TreeNode root) {
  22. int[] res = new int[2];
  23. if(root == null) return res;
  24. int[] left = robAction(root.left);
  25. int[] right = robAction(root.right);
  26. res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);//不偷
  27. res[1] = root.val + left[0] + right[0];//偷
  28. return res;
  29. }
  30. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/39753
推荐阅读
相关标签
  

闽ICP备14008679号