题目来源:🔒LeetCode 364:嵌套列表加权和 II
问题抽象: 给定一个 嵌套整数列表(通过 NestedInteger
接口表示),需计算其 逆深度加权总和(每个整数的权重为 最大深度 - 当前深度 + 1
,根深度为 1
)。
-
嵌套结构定义:
- 列表元素可为 整数 或 子列表(可嵌套任意层);
- 通过标准接口访问:
isInteger()
、getInteger()
、getList()
。
-
加权规则:
- 逆权重机制:权重 =
maxDepth - currentDepth + 1
(根节点权重最大,叶节点权重最小); - 总和 = 所有整数的(值 × 逆权重)之和;
- 需预先计算 全局最大深度(如
[[1,1],2,[1,1]]
最大深度为2
)。
- 逆权重机制:权重 =
-
计算约束:
- 两阶段处理:
- 首次 DFS 遍历计算最大深度
maxDepth
(空间复杂度 O(d),d
为最大深度); - 二次 DFS 遍历计算加权和(基于
maxDepth
);
- 首次 DFS 遍历计算最大深度
- 时间复杂度 O(n)(
n
为所有元素访问次数); - 空间复杂度 O(d)(递归栈深度)。
- 两阶段处理:
-
边界处理:空列表:返回
0
;单层列表:所有节点权重maxDepth
(如maxDepth=1
时权重为1
)。
输入:嵌套整数列表 nestedList
(通过 NestedInteger
列表表示)
输出:逆深度加权总和(整数)。
解题思路
本题要求计算嵌套列表的加权和,权重规则为:从底向上逐层递增,最底层的权重为1,每向上一层权重增加1。核心思路:
- 问题转换:将加权和拆解为两部分:
- 总元素和:所有整数的和(
totalSum
)。 - 深度加权和:每个整数乘以从顶向下深度的和(
levelSum
)。 - 最大深度:整个嵌套列表的最大深度(
maxDepth
)。
- 总元素和:所有整数的和(
- 数学关系:最终加权和 =
(maxDepth + 1) * totalSum - levelSum
。
推导:
设一个元素在从顶向下的深度为d
,从底向上的深度为(maxDepth - d + 1)
。
该元素的贡献值 =值 * (maxDepth - d + 1)
=值 * (maxDepth + 1) - 值 * d
。
因此,总和 =(maxDepth + 1) * totalSum - levelSum
。
算法步骤
- DFS遍历:从深度1开始递归遍历嵌套列表。
- 更新关键变量:
- 遇到整数:更新
totalSum
(累加整数值)和levelSum
(累加整数值×当前深度)。 - 遇到列表:递归处理子列表,深度+1。
- 更新最大深度
maxDepth
(取当前深度和已知深度的最大值)。
- 遇到整数:更新
- 计算结果:遍历结束后,按公式计算最终加权和。
代码实现(Java版)🔥点击下载源码
class Solution {
private int totalSum = 0; // 所有整数的和(不考虑深度)
private int levelSum = 0; // 整数×从顶向下深度的和
private int maxDepth = 0; // 最大深度(从顶向下计数)
public int depthSumInverse(List<NestedInteger> nestedList) {
dfs(nestedList, 1); // 从深度1开始DFS遍历
return (maxDepth + 1) * totalSum - levelSum; // 公式计算结果
}
private void dfs(List<NestedInteger> nestedList, int depth) {
if (nestedList.isEmpty()) return;
maxDepth = Math.max(maxDepth, depth); // 更新最大深度
for (NestedInteger ni : nestedList) {
if (ni.isInteger()) {
int value = ni.getInteger();
totalSum += value; // 累加整数到总元素和
levelSum += value * depth; // 累加整数×深度到深度加权和
} else {
dfs(ni.getList(), depth + 1); // 递归处理子列表,深度+1
}
}
}
}
代码说明
- 变量作用:
totalSum
:累加所有整数值(不区分深度)。levelSum
:累加每个整数值与其从顶向下深度的乘积。maxDepth
:记录整个嵌套列表的最大深度(从顶向下计数)。
- DFS递归:
- 参数:当前嵌套列表
nestedList
和当前深度depth
。 - 遍历列表元素:整数直接更新变量;列表则递归处理(深度+1)。
- 参数:当前嵌套列表
- 结果计算:利用公式
(maxDepth + 1) * totalSum - levelSum
直接得出加权和。