252.LeetCode | 337. 打家劫舍 III

Posted 每天一个开发小知识

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了252.LeetCode | 337. 打家劫舍 III相关的知识,希望对你有一定的参考价值。

每天一个开发小知识


01


题目

某地所有房屋的排列类似于一棵二叉树


如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警


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


示例 1


输入: [3,2,3,null,3,null,1]


     3

    / \

   2   3

    \    \ 

     3    1


输出: 7 

解释: 小偷一晚能够盗取的最高金额 = 3 + 3 + 1 = 7


02

思路

今天意识到解决树问题不止两把斧子:

  1. 递归

  2. 前/中/后序遍历


还有第三把斧子:

  1. 递归+


在上一篇文章中用的是递归+回溯

今天使用 递归+动态规划

动态规划四部曲:

1.定义 dp

dp(node, type):以 node 为根节点时被盗取的最高金额

type 等于 0 表示不打劫当前节点

type 等于 1 表示打劫当前节点

2.找到状态转移方程



3.目标 dp


4.初始化部分 dp

对于叶子节点

dp(node, 0) = 0
dp(node, 1) = node->val

03

解法:递归 + 动态规划

时间复杂度 O(n),空间复杂度 O(n)

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: int rob(TreeNode* root) { return max(Do(root, 0), Do(root, 1)); }
int Do(TreeNode * node, int type) { // type: 0表示不打劫当前节点,1表示打劫当前节点 if (NULL == node) { return 0; }
if (NULL == node->left && NULL == node->right) { if (0 == type) { return 0; } else { return node->val; } }
if (0 == type) { return max(Do(node->left, 0), Do(node->left, 1)) + max(Do(node->right, 0), Do(node->right, 1)); } else { return node->val + Do(node->left, 0) + Do(node->right, 0); } }};

每天一个开发小知识,今天你学废了吗?


以上是关于252.LeetCode | 337. 打家劫舍 III的主要内容,如果未能解决你的问题,请参考以下文章

337.打家劫舍 III

Leetcode 337. 打家劫舍 III

题目地址(337. 打家劫舍 III)

leetcode-337-打家劫舍三*

337. 打家劫舍 III

力扣337——打家劫舍 III