代码随想录算法训练营第四十八天 | 打家劫舍

● 今日学习的文章链接和视频链接

题目198. 打家劫舍
题目213. 打家劫舍 II
题目337. 打家劫舍 III

● 看到题目的第一想法

打家劫舍大礼包

● 看完代码随想录之后的想法

分别讲了基本实现,环路套用,树的DP

● 实现过程中遇到哪些困难

树的DP还是不太理解,基本上知道是后序遍历

● 解题代码

  1. 点击查看代码
    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];
        }
    }
    
  2. 点击查看代码
    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];
    	}
    }
    
  3. 点击查看代码
    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
posted @ 2024-01-15 13:54  雨年今天有记录吗  阅读(1)  评论(0)    收藏  举报