time O(N) space O(H) Two pass
# """
# This is the interface that allows for creating nested lists.
# You should not implement it, or speculate about its implementation
# """
#class NestedInteger:
# def __init__(self, value=None):
# """
# If value is not specified, initializes an empty list.
# Otherwise initializes a single integer equal to value.
# """
#
# def isInteger(self):
# """
# @return True if this NestedInteger holds a single integer, rather than a nested list.
# :rtype bool
# """
#
# def add(self, elem):
# """
# Set this NestedInteger to hold a nested list and adds a nested integer elem to it.
# :rtype void
# """
#
# def setInteger(self, value):
# """
# Set this NestedInteger to hold a single integer equal to value.
# :rtype void
# """
#
# def getInteger(self):
# """
# @return the single integer that this NestedInteger holds, if it holds a single integer
# Return None if this NestedInteger holds a nested list
# :rtype int
# """
#
# def getList(self):
# """
# @return the nested list that this NestedInteger holds, if it holds a nested list
# Return None if this NestedInteger holds a single integer
# :rtype List[NestedInteger]
# """
class Solution:
def depthSumInverse(self, nestedList: List[NestedInteger]) -> int:
self.total = 0
max_depth = self.depth(nestedList,1)
# print(f'max depth is {max_depth}')
self._sum(nestedList,1,max_depth)
return self.total
def depth(self,nestedList,level):
max_level = level
for l in nestedList:
if not l.isInteger():
max_level = max(max_level, self.depth(l.getList(),level+1))
return max_level
# return total sum
def _sum(self,nestedList,level,max_level):
level_sum = 0
for l in nestedList:
if l.isInteger():
level_sum += l.getInteger() * (max_level- level + 1)
else:
self._sum(l.getList(),level+1,max_level)
# print(f'level is {level}, level sum is {level_sum}, maxlevel is {max_level}, weigth is {max_level- level + 1}')
self.total += level_sum
return
One pass
BFS solition:
main idea: global total sum and level sum . use next_level to store next level’s element if current element is not integer, after a loop , assign next_level to nestedList. meanwhile add level sum to total sum.
key point –lower level sums are added multiple times to total sum.
refer