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

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

码农世界 2024-05-23 前端 69 次浏览 0个评论

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 robTree(TreeNode* cur) {
        if (cur == NULL) return vector{0, 0};
        vector left = robTree(cur->left);
        vector 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.不取当前节点,则值为:左节点(取或不取的最大值)+右节点(取或不取的最大值)

转载请注明来自码农世界,本文标题:《代码随想录算法训练营第四十七天|198.打家劫舍》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,69人围观)参与讨论

还没有评论,来说两句吧...

Top