Volver a los desafíos
Intermedio 0 resueltos 0% de aceptación

Tamaños de carpetas con Composite

Calcula el tamaño total de cada carpeta en un árbol donde las carpetas contienen archivos y otras carpetas.

Lo que aprenderás

  • Tratar igual a los elementos sueltos y a los grupos
  • Sumar los totales de los hijos a su padre
  • Recorrer un árbol desde las hojas hacia arriba

Problema

Ver original (inglés)

El patrón composite trata a los objetos individuales y a los grupos de objetos de la misma manera. El tamaño de una carpeta es la suma de sus propios archivos más los tamaños de todo lo que contiene, sin importar la profundidad.

Hay n elementos numerados de 0 a n − 1 que forman un árbol. parents[i] es la carpeta que contiene el elemento i, o -1 para la raíz (exactamente un elemento). sizes[i] es el tamaño del propio contenido del elemento i.

Implementa composite_folder_sizes(parents, sizes).

Entrada

parents: El padre de cada elemento.

sizes: El tamaño propio de cada elemento.

Salida

Devuelve, para cada elemento, su tamaño total: su tamaño propio más los totales de todos sus hijos.

Restricciones

1 ≤ n ≤ 100,000

0 ≤ sizes[i] ≤ 10^9; parents describe un único árbol

Ejemplos

Ejemplo 1
Entrada:
sizes = [1, 2, 3, 4]
parents = [-1, 0, 0, 1]

Salida esperada:
expected = [10, 6, 3, 4]
Entrada:
std::vector<long long> sizes = {1, 2, 3, 4};
std::vector<long long> parents = {-1, 0, 0, 1};

Salida esperada:
std::vector<long long> expected = {10, 6, 3, 4};
Entrada:
long[] sizes = new long[] {1, 2, 3, 4};
long[] parents = new long[] {-1, 0, 0, 1};

Salida esperada:
long[] expected = new long[] {10, 6, 3, 4};

Explicación

El elemento 3 (tamaño 4) está dentro del elemento 1, así que el total de 1 es 2 + 4 = 6. La raíz contiene los elementos 1 y 2: 1 + 6 + 3 = 10. Resultado: [10, 6, 3, 4].

Ejemplo 2
Entrada:
sizes = [5, 0, 7]
parents = [1, -1, 1]

Salida esperada:
expected = [5, 12, 7]
Entrada:
std::vector<long long> sizes = {5, 0, 7};
std::vector<long long> parents = {1, -1, 1};

Salida esperada:
std::vector<long long> expected = {5, 12, 7};
Entrada:
long[] sizes = new long[] {5, 0, 7};
long[] parents = new long[] {1, -1, 1};

Salida esperada:
long[] expected = new long[] {5, 12, 7};

Explicación

La raíz es el elemento 1, sin contenido propio; contiene los elementos 0 y 2: 0 + 5 + 7 = 12.

Cómo abordarlo

Inténtalo primero por tu cuenta y luego abre las pistas una a una.

Pista 1

El total de una carpeta es su propio tamaño más los totales de sus hijos.

Pista 2

Procesa los hijos antes que los padres, por ejemplo por profundidad decreciente.

Pista 3

Evita la recursión profunda en cadenas largas; una pila explícita o un orden es más seguro.

Complejidad esperada

tiempo O(n), espacio extra O(n)

Referencias

Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.