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

198.打家劫舍

这里只需要注意递推公式就可以了:

dp[i]=max(dp[i-2]+nums[i],dp[i-1]);

213.打家劫舍II

这里就是首尾不能同时打劫,所以需要分两种情况讨论

1.不考虑第一间房屋,后面的房子按上题方法进行考虑

2.不考虑最后一间房子,前面的房子按上题方法进行考虑

选择两种情况下的最大值

337.打家劫舍 III

一定是后序遍历(根据子节点的dp大小选择是否将父节点加入)

这里的dp数组大小为2,dp[0]表示不用当前节点,dp[1]表示使用当前节点

vector<int> robTree(TreeNode* cur) {
        if (cur == NULL) return vector<int>{0, 0};
        vector<int> left = robTree(cur->left);
        vector<int> right = robTree(cur->right);
        // 偷cur,那么就不能偷左右节点。
        int val1 = cur->val + left[0] + right[0];
        // 不偷cur,那么可以偷也可以不偷左右节点,则取较大的情况
        int val2 = max(left[0], left[1]) + max(right[0], right[1]);
        return {val2, val1};

遍历的返回值均为数组,因为后序遍历二叉树可以将子节点的情况继承给父节点

(cur->left得到的{val2, val1}在返回上一级后,会被cur->left所继承,参与到cur这层的选择中)

1.取当前节点,则值为:当前节点的值+不取左节点的值+不取右节点的值

2.不取当前节点,则值为:左节点(取或不取的最大值)+右节点(取或不取的最大值)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值