leetcode 337 robos III

Robar la mayor cantidad de dinero!

Título:
Después de la finalización de la última vuelta después de robar una calle y la casa, descubrió que un ladrón puede robar nuevas áreas. La región tiene una sola entrada, lo que llamamos la "raíz". Además de la "raíz", y sólo las casas de una casa "padre" relacionados con ellos. Después de un poco de reconocimiento, astuto ladrón se dio cuenta de que "este lugar todas las casas están dispuestas similar a un árbol binario." Si ambas cámaras están directamente conectados robado la misma noche, la alarma de la casa.
Calculado sin tocar la alarma, un ladrón puede robar la cantidad máxima de la noche.

示例 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.

tema de análisis

  • reclamación
  1. No robar a la casa juntos ⇒ nodo puede no tener unos bordes de conexión directa
  2. Los más casas como robo ⇒ nodo y cuanto más grande mejor
  • Análisis
    para un nodo: directamente conectado al nodo derecho == izquierda nodo +

Si el valor del valor de nodo de la derecha +> nodo izquierda del valor nodo actual
a abandonar el nodo nodo actual robado a la izquierda y la derecha nodo
de otro modo priva a los niños del nodo de nodo de nodo de nodo actual y la derecha ya la izquierda de
la repetición! !

pintura de la foto es intuitiva y fácil de entender

  • Para el nodo 1 == dos opciones (la cantidad de elecciones que quien):
  1. robo 1,4,5,6,7
  2. 2,3 robos
    Aquí Insertar imagen Descripción

Ideas de resolución de problemas

variable efecto
encontrar() Mirando función puede robar a la cantidad máxima de

proceso

Si el nodo es una hoja ==> valor de nodo devuelto directamente

máx( (La cantidad máxima que la cantidad máxima de nodo de nodo + derecho de la izquierda) , los niños (actual valor + nodo de nodo de nodo hijo izquierdo y el nodo + cantidad máxima cantidad máxima nodo) ) ==> recursiva

Devuelve el valor máximo

Código es el siguiente

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;
    }
};
Publicado 34 artículos originales · ganado elogios 0 · Vistas 570

Supongo que te gusta

Origin blog.csdn.net/Luyoom/article/details/104962080
Recomendado
Clasificación