leetcode - 364. Nested List Weight Sum II

Description

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.

Example 1:
leetcode - 364. Nested List Weight Sum II_第1张图片

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

Example 2:
leetcode - 364. Nested List Weight Sum II_第2张图片

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.

Solution

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)

Code

# """
# 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

你可能感兴趣的:(OJ题目记录,leetcode,算法,职场和发展)