LeetCode 339. Nested List Weight Sum
原题链接在这里:https://leetcode.com/problems/nested-list-weight-sum/
题目:
Given a nested list of integers, return the sum of all integers in the list weighted by their depth.
Each element is either an integer, or a list -- whose elements may also be integers or other lists.
Example 1:
Given the list [[1,1],2,[1,1]]
, return 10. (four 1's at depth 2, one 2 at depth 1)
Example 2:
Given the list [1,[4,[6]]]
, return 27. (one 1 at depth 1, one 4 at depth 2, and one 6 at depth 3; 1 + 4*2 + 6*3 = 27)
题解:
For dfs state, it needs current nested list and current depth.
For each NestedInteger ni in the list, if it is integer, add its value * depth to res. Otherwise, continue DFS with it and depth+1.
Time Complexity: O(n). n 是指全部叶子的数目加上dfs走过层数的总数. [[[[[5]]]],[[3]], 1], 3个叶子, dfs一共走了6层. 所以用了 3 + 6 = 9 的时间.
Space: O(D). D 是recursive call用的stack的最大数目, 即是最深的层数, 上面例子最深走过4层, 这里D = 4.
AC Java:
1 /** 2 * // This is the interface that allows for creating nested lists. 3 * // You should not implement it, or speculate about its implementation 4 * public interface NestedInteger { 5 * 6 * // @return true if this NestedInteger holds a single integer, rather than a nested list. 7 * public boolean isInteger(); 8 * 9 * // @return the single integer that this NestedInteger holds, if it holds a single integer 10 * // Return null if this NestedInteger holds a nested list 11 * public Integer getInteger(); 12 * 13 * // @return the nested list that this NestedInteger holds, if it holds a nested list 14 * // Return null if this NestedInteger holds a single integer 15 * public List<NestedInteger> getList(); 16 * } 17 */ 18 public class Solution { 19 public int depthSum(List<NestedInteger> nestedList) { 20 return dfs(nestedList, 1); 21 } 22 private int dfs(List<NestedInteger> nestedList, int depth){ 23 int sum = 0; 24 for(NestedInteger item : nestedList){ 25 if(item.isInteger()){ 26 sum += item.getInteger()*depth; 27 }else{ 28 sum += dfs(item.getList(), depth+1); 29 } 30 } 31 return sum; 32 } 33 }
AC Python:
1 # """ 2 # This is the interface that allows for creating nested lists. 3 # You should not implement it, or speculate about its implementation 4 # """ 5 #class NestedInteger: 6 # def __init__(self, value=None): 7 # """ 8 # If value is not specified, initializes an empty list. 9 # Otherwise initializes a single integer equal to value. 10 # """ 11 # 12 # def isInteger(self): 13 # """ 14 # @return True if this NestedInteger holds a single integer, rather than a nested list. 15 # :rtype bool 16 # """ 17 # 18 # def add(self, elem): 19 # """ 20 # Set this NestedInteger to hold a nested list and adds a nested integer elem to it. 21 # :rtype void 22 # """ 23 # 24 # def setInteger(self, value): 25 # """ 26 # Set this NestedInteger to hold a single integer equal to value. 27 # :rtype void 28 # """ 29 # 30 # def getInteger(self): 31 # """ 32 # @return the single integer that this NestedInteger holds, if it holds a single integer 33 # Return None if this NestedInteger holds a nested list 34 # :rtype int 35 # """ 36 # 37 # def getList(self): 38 # """ 39 # @return the nested list that this NestedInteger holds, if it holds a nested list 40 # Return None if this NestedInteger holds a single integer 41 # :rtype List[NestedInteger] 42 # """ 43 44 class Solution: 45 def depthSum(self, nestedList: List[NestedInteger]) -> int: 46 return self.dfs(nestedList, 1) 47 48 def dfs(self, nestedList, d): 49 res = 0 50 for ni in nestedList: 51 if ni.isInteger(): 52 res += ni.getInteger() * d 53 else: 54 res += self.dfs(ni.getList(), d + 1) 55 56 return res
Could perform BFS as well.
Time Complexity: O(n * d). n is node count, d is maximum depth.
Space: O(d).
AC Python:
1 # """ 2 # This is the interface that allows for creating nested lists. 3 # You should not implement it, or speculate about its implementation 4 # """ 5 #class NestedInteger(object): 6 # def __init__(self, value=None): 7 # """ 8 # If value is not specified, initializes an empty list. 9 # Otherwise initializes a single integer equal to value. 10 # """ 11 # 12 # def isInteger(self): 13 # """ 14 # @return True if this NestedInteger holds a single integer, rather than a nested list. 15 # :rtype bool 16 # """ 17 # 18 # def add(self, elem): 19 # """ 20 # Set this NestedInteger to hold a nested list and adds a nested integer elem to it. 21 # :rtype void 22 # """ 23 # 24 # def setInteger(self, value): 25 # """ 26 # Set this NestedInteger to hold a single integer equal to value. 27 # :rtype void 28 # """ 29 # 30 # def getInteger(self): 31 # """ 32 # @return the single integer that this NestedInteger holds, if it holds a single integer 33 # Return None if this NestedInteger holds a nested list 34 # :rtype int 35 # """ 36 # 37 # def getList(self): 38 # """ 39 # @return the nested list that this NestedInteger holds, if it holds a nested list 40 # Return None if this NestedInteger holds a single integer 41 # :rtype List[NestedInteger] 42 # """ 43 44 class Solution(object): 45 def depthSum(self, nestedList): 46 """ 47 :type nestedList: List[NestedInteger] 48 :rtype: int 49 """ 50 depth = 1 51 res = 0 52 while(nestedList): 53 res += depth * sum(x.getInteger() for x in nestedList if x.isInteger()) 54 nestedList = sum([x.getList() for x in nestedList if not x.isInteger()], []) 55 depth += 1 56 57 return res