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

共 4546字,需浏览 10分钟

 ·

2021-08-29 02:16

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从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.csdn.net/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:敲击计数器

浏览 4
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报