You are given a nested list of integers nestedList. Each element is either an integer or a list whose elements may also be integers or other lists.
The depth of an integer is the number of lists that it is inside of. For example, the nested list [1,[2,2],[[3],2],1] has each integer’s value set to its depth. Let maxDepth be the maximum depth of any integer.
The weight of an integer is maxDepth - (the depth of the integer) + 1
.
Return the sum of each integer in nestedList multiplied by its weight.
Input: nestedList = [[1,1],2,[1,1]]
Output: 8
Explanation: Four 1's with a weight of 1, one 2 with a weight of 2.
1*1 + 1*1 + 2*2 + 1*1 + 1*1 = 8
Input: nestedList = [1,[4,[6]]]
Output: 17
Explanation: One 1 at depth 3, one 4 at depth 2, and one 6 at depth 1.
1*3 + 4*2 + 6*1 = 17
Constraints:
1 <= nestedList.length <= 50
The values of the integers in the nested list is in the range [-100, 100].
The maximum depth of any integer is less than or equal to 50.
Get maximum depth first, then calculate the weight, then multiply and sum.
Time complexity: o ( n ) o(n) o(n)
Space complexity: o ( n ) o(n) o(n)
# """
# 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:
# {num: [depth1, depth2, ...]}
num_depth = {}
queue = collections.deque([])
for each_nlist in nestedList:
queue.append((each_nlist, 1))
max_depth = 0
while queue:
nlist, depth = queue.popleft()
max_depth = max(max_depth, depth)
if nlist.isInteger():
num = nlist.getInteger()
if num not in num_depth:
num_depth[num] = []
num_depth[num].append(depth)
else:
sub_list = nlist.getList()
for sub_nlist in sub_list:
queue.append((sub_nlist, depth + 1))
res = 0
for num, depth_list in num_depth.items():
for each_depth in depth_list:
weight = max_depth - each_depth + 1
res += num * weight
return res