Nested List Weight Sum II
Find max depth, then weight each integer by (maxDepth - itsDepth + 1).
4 min read
tree dfs nested-list
Problem#
Given a nested list of integers, return the sum of each integer multiplied by its weight — where the weight of a value at depth d is maxDepth - d + 1 (leaves are heaviest).
Examples#
[[1,1],2,[1,1]]→8(depth-1 weight=2 for the 2’s; depth-2 weight=1 for the four 1’s)[1,[4,[6]]]→17
Constraints#
1 <= nestedList.length <= 50.
Approach#
Two-pass: first compute the maximum nesting depth, then traverse again summing value * (maxDepth - depth + 1).
Solution#
class Solution {public: int depthSumInverse(vector<NestedInteger>& nestedList) { int maxDepth = 0; function<void(vector<NestedInteger>&, int)> measure = [&](vector<NestedInteger>& list, int d) { maxDepth = max(maxDepth, d); for (auto& ni : list) if (!ni.isInteger()) measure(ni.getList(), d + 1); }; measure(nestedList, 1); int sum = 0; function<void(vector<NestedInteger>&, int)> add = [&](vector<NestedInteger>& list, int d) { for (auto& ni : list) { if (ni.isInteger()) sum += ni.getInteger() * (maxDepth - d + 1); else add(ni.getList(), d + 1); } }; add(nestedList, 1); return sum; }};// NestedInteger interface assumed: IsInteger() bool, GetInteger() int, GetList() []*NestedInteger.
func depthSumInverse(nestedList []*NestedInteger) int { maxDepth := 0 var measure func(list []*NestedInteger, d int) measure = func(list []*NestedInteger, d int) { if d > maxDepth { maxDepth = d } for _, ni := range list { if !ni.IsInteger() { measure(ni.GetList(), d+1) } } } measure(nestedList, 1) sum := 0 var add func(list []*NestedInteger, d int) add = func(list []*NestedInteger, d int) { for _, ni := range list { if ni.IsInteger() { sum += ni.GetInteger() * (maxDepth - d + 1) } else { add(ni.GetList(), d+1) } } } add(nestedList, 1) return sum}from typing import List
# class NestedInteger:# def isInteger(self) -> bool: ...# def getInteger(self) -> int: ...# def getList(self) -> List['NestedInteger']: ...
class Solution: def depthSumInverse(self, nestedList: List['NestedInteger']) -> int: max_depth = 0
def measure(lst: List['NestedInteger'], d: int) -> None: nonlocal max_depth if d > max_depth: max_depth = d for ni in lst: if not ni.isInteger(): measure(ni.getList(), d + 1)
measure(nestedList, 1) total = 0
def add(lst: List['NestedInteger'], d: int) -> None: nonlocal total for ni in lst: if ni.isInteger(): total += ni.getInteger() * (max_depth - d + 1) else: add(ni.getList(), d + 1)
add(nestedList, 1) return total// NestedInteger API: isInteger(), getInteger(), getList()
function depthSumInverse(nestedList) { let maxDepth = 0; const measure = (list, d) => { if (d > maxDepth) maxDepth = d; for (const ni of list) { if (!ni.isInteger()) measure(ni.getList(), d + 1); } }; measure(nestedList, 1); let sum = 0; const add = (list, d) => { for (const ni of list) { if (ni.isInteger()) sum += ni.getInteger() * (maxDepth - d + 1); else add(ni.getList(), d + 1); } }; add(nestedList, 1); return sum;}class Solution { private int maxDepth = 0; private int sum = 0;
public int depthSumInverse(List<NestedInteger> nestedList) { measure(nestedList, 1); add(nestedList, 1); return sum; }
private void measure(List<NestedInteger> list, int d) { if (d > maxDepth) maxDepth = d; for (NestedInteger ni : list) { if (!ni.isInteger()) measure(ni.getList(), d + 1); } }
private void add(List<NestedInteger> list, int d) { for (NestedInteger ni : list) { if (ni.isInteger()) sum += ni.getInteger() * (maxDepth - d + 1); else add(ni.getList(), d + 1); } }}// NestedInteger API: isInteger(), getInteger(), getList()interface NestedInteger { isInteger(): boolean; getInteger(): number; getList(): NestedInteger[];}
function depthSumInverse(nestedList: NestedInteger[]): number { let maxDepth = 0; const measure = (list: NestedInteger[], d: number): void => { if (d > maxDepth) maxDepth = d; for (const ni of list) { if (!ni.isInteger()) measure(ni.getList(), d + 1); } }; measure(nestedList, 1); let sum = 0; const add = (list: NestedInteger[], d: number): void => { for (const ni of list) { if (ni.isInteger()) sum += ni.getInteger() * (maxDepth - d + 1); else add(ni.getList(), d + 1); } }; add(nestedList, 1); return sum;}Editorial#
The weight at depth d is maxDepth - d + 1, so leaves (deepest) get weight 1 and shallowest get the max weight. Computing depth requires a full traversal; doing it in two passes is cleaner than a single accumulator trick.
Complexity#
- Time: O(N) where N is total elements.
- Space: O(D) recursion.
Concept revision#
Related#