【中等】力扣算法题解析LeetCode364:嵌套列表加权和 II

关注文末推广名片,即可免费获得本题测试源码

题目来源:🔒LeetCode 364:嵌套列表加权和 II

问题抽象: 给定一个 嵌套整数列表(通过 NestedInteger 接口表示),需计算其 逆深度加权总和(每个整数的权重为 最大深度 - 当前深度 + 1,根深度为 1)。

  1. 嵌套结构定义

    • 列表元素可为 整数子列表(可嵌套任意层);
    • 通过标准接口访问:isInteger()getInteger()getList()
  2. 加权规则

    • 逆权重机制:权重 = maxDepth - currentDepth + 1(根节点权重最大,叶节点权重最小);
    • 总和 = 所有整数的(值 × 逆权重)之和;
    • 需预先计算 全局最大深度(如 [[1,1],2,[1,1]] 最大深度为 2)。
  3. 计算约束

    • 两阶段处理
      1. 首次 DFS 遍历计算最大深度 maxDepth(空间复杂度 O(d)d 为最大深度);
      2. 二次 DFS 遍历计算加权和(基于 maxDepth);
    • 时间复杂度 O(n)n 为所有元素访问次数);
    • 空间复杂度 O(d)(递归栈深度)。
  4. 边界处理空列表:返回 0单层列表:所有节点权重 maxDepth(如 maxDepth=1 时权重为 1)。

输入:嵌套整数列表 nestedList(通过 NestedInteger 列表表示)
输出:逆深度加权总和(整数)。


解题思路

本题要求计算嵌套列表的加权和,权重规则为:从底向上逐层递增,最底层的权重为1,每向上一层权重增加1。核心思路:

  1. 问题转换:将加权和拆解为两部分:
    • 总元素和:所有整数的和(totalSum)。
    • 深度加权和:每个整数乘以从顶向下深度的和(levelSum)。
    • 最大深度:整个嵌套列表的最大深度(maxDepth)。
  2. 数学关系:最终加权和 = (maxDepth + 1) * totalSum - levelSum
    推导
    设一个元素在从顶向下的深度为 d,从底向上的深度为 (maxDepth - d + 1)
    该元素的贡献值 = 值 * (maxDepth - d + 1)
    = 值 * (maxDepth + 1) - 值 * d
    因此,总和 = (maxDepth + 1) * totalSum - levelSum
算法步骤
  1. DFS遍历:从深度1开始递归遍历嵌套列表。
  2. 更新关键变量
    • 遇到整数:更新 totalSum(累加整数值)和 levelSum(累加整数值×当前深度)。
    • 遇到列表:递归处理子列表,深度+1。
    • 更新最大深度 maxDepth(取当前深度和已知深度的最大值)。
  3. 计算结果:遍历结束后,按公式计算最终加权和。

代码实现(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
            }
        }
    }
}

代码说明

  1. 变量作用
    • totalSum:累加所有整数值(不区分深度)。
    • levelSum:累加每个整数值与其从顶向下深度的乘积。
    • maxDepth:记录整个嵌套列表的最大深度(从顶向下计数)。
  2. DFS递归
    • 参数:当前嵌套列表 nestedList 和当前深度 depth
    • 遍历列表元素:整数直接更新变量;列表则递归处理(深度+1)。
  3. 结果计算:利用公式 (maxDepth + 1) * totalSum - levelSum 直接得出加权和。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值