​LeetCode刷题实战364:加权嵌套序列和 II

本文解析了如何通过广度优先搜索算法解决LeetCode中的加权嵌套序列和II问题,介绍了关键步骤和示例,适合提升算法面试技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 加权嵌套序列和 II,我们先来看题面:

https://leetcode-cn.com/problems/nested-list-weight-sum-ii/

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.

给一个嵌套整数序列,请你返回每个数字在序列中的加权和,它们的权重由它们的深度决定。

序列中的每一个元素要么是一个整数,要么是一个序列(这个序列中的每个元素也同样是整数或序列)。

与 前一个问题 不同的是,前一题的权重按照从根到叶逐一增加,而本题的权重从叶到根逐一增加。

也就是说,在本题中,叶子的权重为1,而根拥有最大的权重。

示例

示例 1:
输入: [[1,1],2,[1,1]]
输出: 8
解释: 四个 1 在深度为 1 的位置, 一个 2 在深度为 2 的位置。

示例 2:
输入: [1,[4,[6]]]
输出: 17
解释: 一个 1 在深度为 3 的位置, 一个 4 在深度为 2 的位置,一个 6 在深度为 1 的位置。13 + 42 + 6*1 = 17。

解题

https://blog.youkuaiyun.com/weixin_44171872/article/details/108766103

主要思路:

(1)使用广度优先,来逐渐的解开各层内容;

(2)广度优先使用队列实现,先将输入的数组压入到队列中,作为初始化的层,然后对每一层的内容进行判断;

(3)对每层的内容取出各个元素,然后对各个元素的每个元素进行判断,判断是否是单个数字,若是,则加上对应的值,若不是,则作为新的嵌套序列压入到队列中;

(4)使用变量cur_weight统计各层各个元素的元素值,由于在每层结束时,都将该值加入到结果变量res中,就相当于处于多少层高度的父节点,就会被累加几次,故相当于乘以了对应的权重;

class Solution {
public:
    int depthSumInverse(vector<NestedInteger>& nestedList) {
        int res=0;
        int cur_weight=0;
        queue<vector<NestedInteger>> q;//广度优先
        q.push(nestedList);//初始化
        while(!q.empty()){//终止条件
          //获得当前层的元素的数量
            int cur_layer=q.size();
            //遍历该层元素
            while(cur_layer--){
              //获得各个元素
                vector<NestedInteger> cur_nest=q.front();
                q.pop();
                //对当前元素的各个元素进行判断
                for(int i=0;i<cur_nest.size();++i){
                  //若是单个数字,则累加统计变量中
                    if(cur_nest[i].isInteger()){
                        cur_weight+=cur_nest[i].getInteger();
                    }
                    //若不是单个数字,则将其作为新的序列压入到队列中
                    else{
                        q.push(cur_nest[i].getList());
                    }
                }
            }
            //累加之前的值
            res+=cur_weight;
        }
        return res;
    }
};

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-360题汇总,希望对你有点帮助!

LeetCode刷题实战361:轰炸敌人

LeetCode刷题实战362:敲击计数器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值