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
- No robar a la casa juntos ⇒ nodo puede no tener unos bordes de conexión directa
- 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):
- robo 1,4,5,6,7
- 2,3 robos
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;
}
};