leetcode 337 vols III

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
  1. Non cambrioler la maison ensemble ⇒ noeud ne peut pas avoir un bord de connexion directe
  2. 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):
  1. vol qualifié 1,4,5,6,7
  2. 2,3 vol
    Insérer ici l'image Description

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;
    }
};
Publié 34 articles originaux · louange gagnées 0 · Vues 570

Je suppose que tu aimes

Origine blog.csdn.net/Luyoom/article/details/104962080
conseillé
Classement