337.打家劫舍III
链接:337.打家劫舍III
难度:Medium
标签:树、深度优先搜索、动态规划、二叉树
简介:计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。
题解 1 - typescript
- 编辑时间:2020-08-05
- 执行用时:108ms
- 内存消耗:44MB
- 编程语言:typescript
- 解法介绍:深度优先搜索,对每个节点进行判断偷与不偷的情况。
function rob(root: TreeNode | null): number {
const f = new Map<TreeNode | null, number>();
const g = new Map<TreeNode | null, number>();
f.set(null, 0);
g.set(null, 0);
dfs(root);
return Math.max(f.get(root)!, g.get(root)!);
function dfs(node: TreeNode | null) {
if (node === null) return;
dfs(node.left);
dfs(node.right);
f.set(node, node.val + g.get(node.left)! + g.get(node.right)!);
g.set(
node,
Math.max(f.get(node.left)!, g.get(node.left)!) +
Math.max(f.get(node.right)!, g.get(node.right)!)
);
}
}
题解 2 - cpp
- 编辑时间:2023-09-18
- 执行用时:28ms
- 内存消耗:30.57MB
- 编程语言:cpp
- 解法介绍:dfs时记录偷取当前节点和不偷取时的最大值。
class Solution {
public:
vector<int> find(TreeNode *node) {
vector<int> res{0, 0};
if (node) {
auto l = find(node->left), r = find(node->right);
res[0] = max(l[0], l[1]) + max(r[0], r[1]);
res[1] = l[0] + r[0] + node->val;
}
return res;
}
int rob(TreeNode* root) {
auto res = find(root);
return max(res[0], res[1]);
}
};
题解 3 - python
- 编辑时间:2023-09-18
- 执行用时:52ms
- 内存消耗:18.6MB
- 编程语言:python
- 解法介绍:同上。
class Solution:
def rob(self, root: Optional[TreeNode]) -> int:
def find(node: Optional[TreeNode]) -> List[int]:
res = [0, 0]
if node:
l, r = find(node.left), find(node.right)
res[0] = max(l) + max(r)
res[1] = l[0] + r[0] + node.val
return res
return max(find(root))
题解 4 - rust
- 编辑时间:2023-09-18
- 执行用时:4ms
- 内存消耗:2.81MB
- 编程语言:rust
- 解法介绍:同上。
use std::cell::RefCell;
use std::rc::Rc;
fn find(node: Option<&Rc<RefCell<TreeNode>>>) -> Vec<i32> {
let mut res = vec![0, 0];
if let Some(node) = node {
let node_ref = node.as_ref().borrow();
let l = find(node_ref.left.as_ref());
let r = find(node_ref.right.as_ref());
res[1] = l[0] + r[0] + node_ref.val;
res[0] = l.into_iter().max().unwrap() + r.into_iter().max().unwrap();
}
res
}
impl Solution {
pub fn rob(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {
let node = root.as_ref();
find(root.as_ref()).into_iter().max().unwrap()
}
}