问题描述
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)
思路分析
嵌套整数链表的加权求和。这个结构里面有整数也有链表,整数的话就乘上深度返回,而是链表的话就进入下一层继续遍历。
我们可以很容易的由嵌套想到递归解决这个问题,类似于深度优先遍历。
代码
/**
* // This is the interface that allows for creating nested lists.
* // You should not implement it, or speculate about its implementation
* class NestedInteger {
* public:
* // Constructor initializes an empty nested list.
* NestedInteger();
*
* // Constructor initializes a single integer.
* NestedInteger(int value);
*
* // Return true if this NestedInteger holds a single integer, rather than a nested list.
* bool isInteger() const;
*
* // Return the single integer that this NestedInteger holds, if it holds a single integer
* // The result is undefined if this NestedInteger holds a nested list
* int getInteger() const;
*
* // Set this NestedInteger to hold a single integer.
* void setInteger(int value);
*
* // Set this NestedInteger to hold a nested list and adds a nested integer to it.
* void add(const NestedInteger &ni);
*
* // Return the nested list that this NestedInteger holds, if it holds a nested list
* // The result is undefined if this NestedInteger holds a single integer
* const vector<NestedInteger> &getList() const;
* };
*/
class Solution {
public:
int depthSum(vector<NestedInteger>& nestedList) {
return DFS(nestedList, 1);
}
int DFS(vector<NestedInteger>& nestedList, int depth){
int sum = 0;
for (NestedInteger ni:nestedList){
if (ni.isInteger())
sum += ni.getInteger() * depth;
else
sum += DFS(ni.getList(), depth + 1);
}
return sum;
}
};
时间复杂度:
O(n)
空间复杂度:
O(1)
反思
不能被自己设置的类吓到,都是很正常的使用方式。