代码随想录训练营day48|dp:198. 打家劫舍、213.打家劫舍2

文章介绍了LeetCode上的两道题目——打家劫舍198和213,都是关于动态规划的问题。解决方案通过维护一个dp数组,计算在不相邻的房间中选择哪些可以获得最大金额。对于打家劫舍2,由于数组形成环状,需要考虑两种情况:从头开始或从第二个房间开始。
摘要由CSDN通过智能技术生成

LeetCode198打家劫舍

class Solution {
    public int rob(int[] nums) {
        /**第三遍:
        dp[i]:偷到i号房间是的最高金额
        dp[i] = max(dp[i-1], dp[i-2]+nums[i]) 表示偷上一户而不偷i这一户;或者上上一户和当前这一户 
        dp[0] = nums[0];
        dp[1] = max(nums[0], nums[1]);
        循环方向:从前到后
         */
        int size = nums.length;
        if(size == 1){
            return nums[0];
        }
        int[] dp = new int[size];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        for(int i=2;i<size;i++){
            dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i]);
        }
        return dp[size-1];
    }
}

LeetCode213打家劫舍2

class Solution {
    public int rob(int[] nums) {
        /**第三遍
        这里是环装的,所以要对收尾分情况。因为首位相连的。
         */
        int size = nums.length;
        if(size == 1){
            return nums[0];
        }
        int ans1 = getRob(nums, 0, size-1);
        int ans2 = getRob(nums, 1, size);
        return Math.max(ans1, ans2);
    }

    public int getRob(int[] nums, int start, int end){
    	//这种模式,dp的start 和 end就直接和nums里对应就好了。
        if(end-start==1){
            return nums[start];
        }
        int size = end-start + 1;
        int[] dp = new int[nums.length];
        dp[start] = nums[start]; 
        dp[start+1] = Math.max(nums[start], nums[start+1]);
        for(int i=start+2;i<end;i++){
            dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i]);
        }
        return dp[end-1];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值