Categorías
Algorithms Interview

LeetCode – Suma de peso de lista anidada II (Java)

Dada una lista anidada de enteros, devuelve la suma de todos los enteros en la lista ponderados por su profundidad.

Cada elemento es un número entero o una lista, cuyos elementos también pueden ser números enteros u otras listas.

A diferencia de la pregunta anterior donde el peso aumenta de raíz a hoja, ahora el peso se define de abajo hacia arriba. es decir, los números enteros a nivel de hoja tienen un peso 1 y los números enteros a nivel de raíz tienen el peso más grande.

Ejemplo 1:
Dada la lista [[1,1], 2,[1,1]]devuelve 8. (cuatro unos en la profundidad 1, uno 2 en la profundidad 2)

Ejemplo 2:
Dada la lista [1,[4,[6]]]devuelve 17. (uno 1 en profundidad 3, uno 4 en profundidad 2 y uno 6 en profundidad 1; 1 * 3 + 4 * 2 + 6 * 1 = 17)

Solución Java

public int depthSumInverse(List<NestedInteger> nestedList) {
    if(nestedList==null||nestedList.size()==0)
        return 0;
 
    HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
 
    //two stacks: one is for processing nested integer, the other is for tracking layers. 
    Stack<NestedInteger> stack = new Stack<NestedInteger>();
    Stack<Integer> layers = new Stack<Integer>();
 
    //put all NestedIntegers to Stack and record its layer to be 1
    for(NestedInteger ni: nestedList){
        stack.push(ni);
        layers.push(1);
    }
 
    int maxLayer=Integer.MIN_VALUE;
 
    while(!stack.isEmpty()){
        NestedInteger top = stack.pop();
        int topLayer = layers.pop();
 
        maxLayer=Math.max(maxLayer, topLayer);
 
        if(top.isInteger()){
            if(map.containsKey(topLayer)){
                map.get(topLayer).add(top.getInteger());
            }else{
                ArrayList<Integer> list = new ArrayList<Integer>();
                list.add(top.getInteger());
                map.put(topLayer, list);
            }        
        }else{
            for(NestedInteger ni: top.getList()){
                stack.push(ni);
                layers.push(topLayer+1);
            }
        }
    }
 
    // calcualte sum
    int result=0;
    for(int i=maxLayer; i>=1; i--){
        if(map.get(i)!=null){
            for(int v: map.get(i)){
                result += v*(maxLayer-i+1);
            }
        }
    }
 
    return result;
}

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *