题目链接

LeetCode 337. 打家劫舍 III[1]

往期回顾:打家劫舍 I :
【每日算法Day 104】偷电瓶的周某今天放出来了,还不赶紧做这道题防范一下![2]

往期回顾:打家劫舍 II :
【每日算法Day 105】打家劫舍第二弹:看好你的电瓶车![3]

题目描述

在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为。 除了之外,每栋房子有且只有一个房子与之相连。一番侦察之后,聪明的小偷意识到这个地方的所有房屋的排列类似于一棵二叉树。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。

计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。

示例1

        输入:
[3,2,3,null,3,null,1]3/ \2   3\   \ 3   1
输出:
7
解释:
小偷一晚能够盗取的最高金额 = 3 + 3 + 1 = 7.

示例2

        输入:
[3,4,5,1,3,null,1]3/ \4   5/ \   \ 1   3   1
输出:
9
解释:
小偷一晚能够盗取的最高金额 = 4 + 5 = 9.

题解

这次是在一棵树上偷窃了,做法还是一样。对于结点 r 来说,我们还是分为偷和不偷两种情况。

如果偷的话,它的左右儿子就不能偷了,所以最大价值就是左儿子不偷的最大价值,加上右儿子不偷的最大价值,再加上 r 的价值。

而如果不偷的话,最大价值就是左儿子偷或不偷的最大价值,加上右儿子偷或不偷的最大价值。

因为需要用到儿子结点偷和不偷两个价值,所以需要在 dfs 时返回两个值,用来表示偷和不偷两个最大价值,具体实现时用 pair 来表示。

可能有人会用另一种实现方式,用 dfs0 表示不偷的最大价值,dfs1 表示偷的最大价值,然后两个函数互相调用。注意这样理论上是可行的,但是会产生很多重复计算,最终会超时。所以这种方法需要记忆化搜索,比较麻烦,需要用 map<TreeNode*, int> 来保存每个结点的答案。

代码

复杂实现方式(c++)

        class Solution {public:unordered_map<TreeNode*, int> dp0, dp1;int dfs0(TreeNode* root) {if (!root) return 0;if (dp0.find(root) != dp0.end()) return dp0[root];int res = 0;res += max(dfs0(root->left), dfs1(root->left));res += max(dfs0(root->right), dfs1(root->right));return dp0[root]=res;}int dfs1(TreeNode* root) {if (!root) return 0;if (dp1.find(root) != dp1.end()) return dp1[root];int res = root->val;res += dfs0(root->left);res += dfs0(root->right);return dp1[root]=res;}int rob(TreeNode* root) {if (!root) return 0;dp0.clear();dp1.clear();return max(dfs0(root), dfs1(root));}
};

精简实现方式(c++)

        class Solution {public:typedef pair<int, int> pii;pii dfs(TreeNode* root) {if (!root) return {0, 0};pii l = dfs(root->left);pii r = dfs(root->right);int r0 = max(l.first, l.second) + max(r.first, r.second);int r1 = l.first + r.first + root->val;return {r0, r1};}int rob(TreeNode* root) {pii res = dfs(root);return max(res.first, res.second);}
};

参考资料

[1]

LeetCode 337. 打家劫舍 III: https://leetcode-cn.com/problems/house-robber-iii/

[2]

【每日算法Day 104】偷电瓶的周某今天放出来了,还不赶紧做这道题防范一下!: https://godweiyang.com/2020/04/18/leetcode-198/

[3]

【每日算法Day 105】打家劫舍第二弹:看好你的电瓶车!: https://godweiyang.com/2020/04/19/leetcode-213/

【每日算法Day 106】打家劫舍系列最后一弹,撑住你就赢了!相关推荐

  1. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  2. java回文数算法for_【Java】【每日算法/刷穿 LeetCode】9. 回文数(简单)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]9. 回文数(简单) 宫水三叶发布于 今天 15:30 题目描述 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从 ...

  3. 每日算法刷题Day7-比较字符串大小,去掉多余的空格,单词替换

    ⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法.

  4. 每日算法刷题Day10-字符串最大跨距、最长公共字符串后缀

    CSDN话题挑战赛第2期 参赛话题:算法题解 ⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以 ...

  5. 每日算法刷题Day5-平方矩阵II和III、蛇形矩阵图解

    ⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法.

  6. 整数反转leetcode java_【Java】【每日算法/刷穿 LeetCode】7. 整数反转(简单)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]7. 整数反转(简单) 宫水三叶发布于 今天 12:10 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数 ...

  7. java编写字母z算法_【Java】【每日算法/刷穿 LeetCode】6. Z 字形变换(中等)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]6. Z 字形变换(中等) 宫水三叶发布于 今天 12:03 题目描述 将一个给定字符串 s 根据给定的行数 numRows , ...

  8. java 最长回文_【Java】【每日算法/刷穿 LeetCode】5. 最长回文子串(中等)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]5. 最长回文子串(中等) 宫水三叶发布于 今天 12:00 题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 示例 ...

  9. 【每日算法】C语言8大经典排序算法(2)

    接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...

  10. 打家劫舍系列(dp)

    引言 打家劫舍类的题目是动态规划里的经典题目,有很多种变换形式,下面就介绍一下力扣里面的所有打家劫舍的题目: 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯 ...

最新文章

  1. php mvc单入口搭建,PHP实现MVC开发最简单方法是单点入口
  2. NYOJ 674 善良的国王(树形背包DP)
  3. word List 30
  4. 你经历过最奇特的梦境是怎样的?
  5. Effective Objective-C 2.0 Tips 总结 Chapter 3 Chapter 4
  6. eclipse,aptana,zendstudio,flex全屏插件
  7. 知识表示与计算机,两分钟了解人工智能中的“知识与知识表示”
  8. 鸿蒙系统pc版测评,华为MatePad Pro测评:鸿蒙系统+麒麟9000,旗舰平板封神之作?...
  9. dnf一天能获得多少黑暗之眼_DNF:想快速积累史诗狗眼?这几个方法可别错过,一天最少四五个...
  10. linux系统查看内核版本是多少,在linux下查看内核版本、gcc版本、操作系统多少位等参数...
  11. Event-Driven架构设计消息处理系统
  12. Tomcat8.5后版本不返回200 OK的问题解决
  13. [生存志] 第96节 南华著真经
  14. 【第一组】第十五次冲刺例会纪要
  15. python手机版下载-手机python下载
  16. mysQL uuID 查询
  17. Hypervisor 简介
  18. 开启springcloud全家桶5:探索负载均衡组件 Ribbon实现与原理
  19. 【数据挖掘】数据挖掘工程师是做什么的?
  20. Patrol Read vs Consistency Check

热门文章

  1. (转载)Linux上iptables防火墙的基本应用教程
  2. 看看MySQL几种主流备份方案的优缺点
  3. 将文件保存到数据库中
  4. mysql补0操作有什么意义?
  5. 读取本地IP地址和子网页码
  6. C++的函数指针的使用(仍存在问题)
  7. oracle定义变量
  8. cocos2dx阴影层的实现
  9. access 数据库目录权限只读引起asp的访问错误
  10. 实验六:流类库与I/O