0324-2020-LEETCODE-面试17.16-按摩师问题(198-213-337-打家劫舍问题)-(DP)

DP的更新方程的思想自己也想到了,但是没有完整的写出来。
递归方程:dp[i] = Math.max(dp[i - 1],dp[i - 2] + nums[i]);

作者:sweetiee
链接:https://leetcode-cn.com/problems/the-masseuse-lcci/solution/100-kong-jian-cong-onyou-hua-dao-o1bao-hui-by-swee/
两种写法,第二种难理解但是更加简洁。

198.打家劫舍

public int massage(int[] nums) {
        if (nums == null || nums.length ==0){
            return 0;
        }
        if (nums.length == 1){
            return nums[0];
        }
        int[] res = new int[nums.length];
        res[0] = nums[0];
        res[1] = Math.max(nums[0],nums[1]);
        for (int i = 2; i < nums.length; ++i) {
            res[i] = Math.max(res[i - 1],res[i - 2] + nums[i]);
        }
        return res[nums.length - 1];
    }
class Solution {
    public int massage(int[] nums) {
        int a = 0, b = 0;
        for (int i = 0; i < nums.length; i++) {
            int c = Math.max(b, a + nums[i]);
            a = b;
            b = c;
        }
        return b;
    }
}

213.打家劫舍(环)

自己写的,因为要构成环,所以环的首尾不能同时被抢,所以,我们就把首尾去掉一个
分别求一次最大值,最后比较一下不就行了吗?
代码:
以后写的时候三目尽量少用,最更大值可以换成Math.max()这种方法。

	public int rob(int[] nums) {
        int len = nums.length;
        if (len == 0) return 0;
        if (len == 1) return nums[0];
        if (len == 2) return nums[0] > nums[1] ? nums[0] : nums[1];
        //if(len == 3) return nums[1];

        int[] dp1 = new int[len - 1];
        dp1[0] = nums[0];
        dp1[1] = nums[0] > nums[1] ? nums[0] : nums[1];
        for (int i = 2; i < dp1.length; i++) {
            dp1[i] = Math.max(dp1[i - 2] + nums[i], dp1[i - 1]);
        }

        int[] dp2 = new int[len - 1];
        dp2[0] = nums[1];
        dp2[1] = nums[2] > nums[1] ? nums[2] : nums[1];
        for (int i = 2; i < dp2.length; i++) {
            dp2[i] = Math.max(dp2[i - 2] + nums[i + 1], dp2[i - 1]);
        }
        return dp1[len - 2] > dp2[len - 2] ? dp1[len - 2] : dp2[len - 2];
    }

337.打家劫舍(二叉树)

代码来源:https://leetcode-cn.com/problems/house-robber-iii/solution/tong-yong-si-lu-tuan-mie-da-jia-jie-she-wen-ti-b-2/
评论区:https://leetcode-cn.com/problems/house-robber-iii/comments/
用的是树的经典递归,设置一个长度为2的数组,代表此次的not_rob和rob,一步一步选择,最后得到最大值。

	public int rob(TreeNode root) {
        int[] res = dp(root);
        return Math.max(res[0],res[1]);
    }

    private int[] dp(TreeNode root) {
        if (root == null) {
            return new int[]{0,0};
        }
        int[] left = dp(root.left);
        int[] right = dp(root.right);
        int rob = root.val + left[0] + right[0];
        int not_rob = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);
        return new int[]{not_rob,rob};
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值