337. 打家劫舍 III
题目链接:337. 打家劫舍 III
方法:树形dp
解题思路
- 对于每个节点,可能有选或者不选两种情况,对于两种情况下的数值均进行返回,其可以有子节点的数值转移而来;
- 假设第一个返回值表示选当前节点的值
,第二个表示不选的值 _ ,先计算其子节点的返回值, 和 ; select = val + left.second + right.second
,表示选择当前节点,则子节点就不能选择;no_select = max(left.first, left.second) + max(right.first, right.second)
,表示不选择当前节点,那么子节点可选可不选,此时根据题意选择最大或最小值进行计算;- 递归边界:当指针为空时,返回
。
代码
class Solution {
public:
int rob(TreeNode* root) {
function<pair<int, int>(TreeNode*)> dfs = [&](TreeNode* root) -> pair<int, int> {
if (!root) return {0, 0};
pair<int, int> left, right; // first 表示选,second 表示不选
left = dfs(root->left);
right = dfs(root->right);
int rob = root->val + left.second + right.second;
int not_rob = max(left.first, left.second) + max(right.first, right.second);
return {rob, not_rob};
};
pair<int, int> ans = dfs(root);
return max(ans.first, ans.second);
}
};
复杂度分析
时间复杂度:
空间复杂度:
分类:
leetcode题解
标签:
树形dp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix