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.
Different from the previous question where weight is increasing from root to leaf, now the weight is defined from bottom up. i.e., the leaf level integers have weight 1, and the root level integers have the largest weight.
Example 1:
Given the list [[1,1],2,[1,1]], return 8. (four 1's at depth 1, one 2 at depth 2)
Example 2:
Given the list [1,[4,[6]]], return 17. (one 1 at depth 3, one 4 at depth 2, and one 6 at depth 1; 1*3 + 4*2 + 6*1 = 17)
思路:
这道题是之前那道Nested List Weight Sum的拓展,与其不同的是,这道题的深度越深,权重越小,和之前刚好相反。比如题目中给的两个例子,建立的二维数组分别为:
[[1,1],2,[1,1]]:
1 1 1 1
2
[1,[4,[6]]]:
1
4
6
这个方法就比较巧妙了,由史蒂芬大神提出来的,这个方法用了两个变量unweighted和weighted,非权重和跟权重和,初始化均为0,然后如果nestedList不为空开始循环,先声明一个空数组nextLevel,遍历nestedList中的元素,如果是数字,则非权重和加上这个数字,如果是数组,就加入nextLevel,这样遍历完成后,第一层的数字和保存在非权重和unweighted中了,其余元素都存入了nextLevel中,此时我们将unweighted加到weighted中,将nextLevel赋给nestedList,这样再进入下一层计算,由于上一层的值还在unweighted中,所以第二层计算完将unweighted加入weighted中时,相当于第一层的数字和被加了两次,这样就完美的符合要求了
代码:
public class Solution {
public static int depthSum(List<NestedInteger> nestedList) {
int unweighted = 0, weighted = 0;
while (!nestedList.isEmpty()) {
List<NestedInteger> nextLevel = new ArrayList<>();
for (NestedInteger a : nestedList) {
if (a.isInteger()) {
unweighted += a.getInteger();
} else {
nextLevel.addAll(a.getList());
}
}
weighted += unweighted;
nestedList = nextLevel;
}
return weighted;
}
public static void main(String[] args) {
NestedInteger n1 = new NestedInteger(2);
NestedInteger n2 = new NestedInteger(1);
NestedInteger n3 = new NestedInteger(1);
NestedInteger n4 = new NestedInteger(1);
NestedInteger n5 = new NestedInteger(1);
List<NestedInteger> sublist1 = new ArrayList<>();
sublist1.add(n2);
sublist1.add(n3);
NestedInteger list1 = new NestedInteger(null, sublist1);
List<NestedInteger> sublist2 = new ArrayList<>();
sublist2.add(n4);
sublist2.add(n5);
NestedInteger list2 = new NestedInteger(null, sublist2);
List<NestedInteger> list = new ArrayList<>();
list.add(list1);
list.add(n1);
list.add(list2);
System.out.println(depthSum(list));
}
}
class NestedInteger {
Integer value;
List<NestedInteger> list;
NestedInteger(Integer value) {
this.value = value;
}
NestedInteger(Integer value, List<NestedInteger> list) {
this.value = value;
this.list = list;
}
public boolean isInteger() { return value != null; }
public Integer getInteger() { return value;}
public List<NestedInteger> getList() { return list;}
}