Steal le plus d'argent!
Titre:
Après l'achèvement du dernier tour après avoir volé une rue et la maison, a découvert un voleur peut voler de nouveaux domaines. La région ne possède qu'une seule entrée, que nous appelons la « racine ». En plus de la « racine », et que les maisons une maison « mère » qui lui est associée. Après une reconnaissance, voleur intelligent rendu compte que « ce lieu toutes les maisons sont disposées semblable à un arbre binaire. » Si les deux maisons sont reliées directement volé la même nuit, l'alarme de la maison.
Calculé sans toucher l'alarme, un voleur peut voler le montant maximum de la nuit.
示例 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.
analyse du sujet
- revendication
- Non cambrioler la maison ensemble ⇒ noeud ne peut pas avoir un bord de connexion directe
- Les maisons plus que le vol ⇒ nœud et plus le meilleur
- Analyse
d'un nœud: directement connecté au noeud droit == gauche nœud +
Si la valeur du droit valeur noeud +> noeud gauche de la valeur du noeud courant
d'abandonner le noeud noeud courant volé noeud gauche et à droite
sinon privent les enfants du noeud noeud courant noeud noeud et la droite et à gauche de
récursion! !
peinture photo est intuitive facile à comprendre
- Pour le nœud 1 == deux options (le montant de l'élection qui qui):
- vol qualifié 1,4,5,6,7
- 2,3 vol
idées de résolution de problèmes
variable | effet |
---|---|
trouver() | fonction recherche peut voler le montant maximum de |
processus
Si le nœud est une feuille ==> valeur de noeud retourné directement
max( (Le montant maximum de la quantité maximale de gauche + droite noeud noeud) , les enfants (courant ) ==> récursive
Renvoie la valeur maximale
Code est la suivante
int find(TreeNode*root)
{
if(!root) return 0;
if(!root->left && !root->right) return root->val;
int left = find(root->left);
int right = find(root->right);
int maxn = root->val;
if(root->left) maxn = maxn+find(root->left->left)+find(root->left->right); //当前结点值+左节点的孩子的最大金额
if(root->right) maxn = maxn+find(root->right->left)+find(root->right->right); //当前结点值+右节点的孩子的最大金额
return max(maxn,left+right);
}
class Solution {
public:
int rob(TreeNode* root) {
int ans = find(root);
return ans;
}
};