列表

详情


364. 加权嵌套序列和 II

给你一个整数嵌套列表 nestedList ,每一个元素要么是一个整数,要么是一个列表(这个列表中的每个元素也同样是整数或列表)。

整数的 深度 取决于它位于多少个列表内部。例如,嵌套列表 [1,[2,2],[[3],2],1] 的每个整数的值都等于它的 深度 。令 maxDepth 是任意整数的 最大深度

整数的 权重maxDepth - (整数的深度) + 1

nestedList 列表中每个整数先乘权重再求和,返回该加权和。

 

示例 1:

输入:nestedList = [[1,1],2,[1,1]]
输出:8
解释:4 个 1 在深度为 1 的位置, 一个 2 在深度为 2 的位置。
1*1 + 1*1 + 2*2 + 1*1 + 1*1 = 8

示例 2:

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

 

提示:

相似题目

嵌套列表权重和

数组嵌套

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
/** * // 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 depthSumInverse(vector<NestedInteger>& nestedList) { } };

golang 解法, 执行用时: 0 ms, 内存消耗: 2 MB, 提交时间: 2023-10-21 23:01:44

/**
 * // This is the interface that allows for creating nested lists.
 * // You should not implement it, or speculate about its implementation
 * type NestedInteger struct {
 * }
 *
 * // Return true if this NestedInteger holds a single integer, rather than a nested list.
 * func (n NestedInteger) IsInteger() bool {}
 *
 * // 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
 * // So before calling this method, you should have a check
 * func (n NestedInteger) GetInteger() int {}
 *
 * // Set this NestedInteger to hold a single integer.
 * func (n *NestedInteger) SetInteger(value int) {}
 *
 * // Set this NestedInteger to hold a nested list and adds a nested integer to it.
 * func (n *NestedInteger) Add(elem NestedInteger) {}
 *
 * // Return the nested list that this NestedInteger holds, if it holds a nested list
 * // The list length is zero if this NestedInteger holds a single integer
 * // You can access NestedInteger's List element directly if you want to modify it
 * func (n NestedInteger) GetList() []*NestedInteger {}
 */
func depthSumInverse(nestedList []*NestedInteger) int {
    maxDepth := getMaxDepth(nestedList)
    var cal func(nestedList []*NestedInteger, depth int) int
    cal = func(nestedList []*NestedInteger, depth int) int {
        res := 0
        for i := range nestedList {
            if nestedList[i].IsInteger() {
                res += nestedList[i].GetInteger()*(maxDepth-depth+1)
            } else {
                res += cal(nestedList[i].GetList(), depth+1)
            }
        }
        return res
    }
    return cal(nestedList, 1)
}

func getMaxDepth(nestedList []*NestedInteger) int {
    res := 1
    // 空列表的最大深度无效
    if len(nestedList) == 0 {
        return math.MinInt32
    }
    for i := range nestedList {
        if !nestedList[i].IsInteger() {
            res = max(res, getMaxDepth(nestedList[i].GetList())+1)
        }
    }
    return res
}

func max(a, b int) int {
    if a < b {
        return b
    }
    return a
}

cpp 解法, 执行用时: 0 ms, 内存消耗: 9 MB, 提交时间: 2023-10-21 22:59:13

/**
 * // 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 depthSumInverse(vector<NestedInteger>& nestedList) {
        int res = 0;
        vector<vector<int>> integersListByDepth;
        for (auto& nl : nestedList) {
            dfs(nl, 0, integersListByDepth);
        }

        int N = integersListByDepth.size();
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < integersListByDepth[i].size(); j++) {
                res += integersListByDepth[i][j] * (N - i);
            }
        }

        return res;
    }

private:
    void dfs(NestedInteger& ni, int depth, vector<vector<int>>& integersListByDepth) {
        if (depth == integersListByDepth.size()) {
            integersListByDepth.push_back(vector<int>());
        }

        if (ni.isInteger()) {
            integersListByDepth[depth].push_back(ni.getInteger());
        } else {
            for (auto& nl : ni.getList()) {
                dfs(nl, depth + 1, integersListByDepth);
            }
        }
    }
};

java 解法, 执行用时: 1 ms, 内存消耗: 39.1 MB, 提交时间: 2023-10-21 22:57:59

/**
 * // This is the interface that allows for creating nested lists.
 * // You should not implement it, or speculate about its implementation
 * public interface NestedInteger {
 *     // Constructor initializes an empty nested list.
 *     public NestedInteger();
 *
 *     // Constructor initializes a single integer.
 *     public NestedInteger(int value);
 *
 *     // @return true if this NestedInteger holds a single integer, rather than a nested list.
 *     public boolean isInteger();
 *
 *     // @return the single integer that this NestedInteger holds, if it holds a single integer
 *     // Return null if this NestedInteger holds a nested list
 *     public Integer getInteger();
 *
 *     // Set this NestedInteger to hold a single integer.
 *     public void setInteger(int value);
 *
 *     // Set this NestedInteger to hold a nested list and adds a nested integer to it.
 *     public void add(NestedInteger ni);
 *
 *     // @return the nested list that this NestedInteger holds, if it holds a nested list
 *     // Return empty list if this NestedInteger holds a single integer
 *     public List<NestedInteger> getList();
 * }
 */
class Solution {
    public int depthSumInverse(List<NestedInteger> nestedList) {
        int result = 0;
        if(nestedList == null || nestedList.size() == 0){
            return result;
        }
        Queue<NestedInteger> queue = new LinkedList<NestedInteger>();
        Stack<Integer> levelSum = new Stack<Integer>();
        for(int i = 0; i < nestedList.size(); i++){
            queue.offer(nestedList.get(i));
        }
        while(!queue.isEmpty()){
            int size = queue.size();
            int eachLevel = 0;
            for(int i = 0; i < size; i++){
                NestedInteger temp = queue.poll();
                if(temp.isInteger()){
                    eachLevel += temp.getInteger();
                }else{
                    for(NestedInteger one : temp.getList()){
                        queue.offer(one);
                    }
                }
            }
            levelSum.push(eachLevel);
        }
        int n = 1;
        while(!levelSum.isEmpty()){
            result += n * levelSum.pop();
            n++;
        }
        return result;
    }
}

python3 解法, 执行用时: 32 ms, 内存消耗: 16.3 MB, 提交时间: 2023-10-21 22:56:29

# """
# This is the interface that allows for creating nested lists.
# You should not implement it, or speculate about its implementation
# """
#class NestedInteger:
#    def __init__(self, value=None):
#        """
#        If value is not specified, initializes an empty list.
#        Otherwise initializes a single integer equal to value.
#        """
#
#    def isInteger(self):
#        """
#        @return True if this NestedInteger holds a single integer, rather than a nested list.
#        :rtype bool
#        """
#
#    def add(self, elem):
#        """
#        Set this NestedInteger to hold a nested list and adds a nested integer elem to it.
#        :rtype void
#        """
#
#    def setInteger(self, value):
#        """
#        Set this NestedInteger to hold a single integer equal to value.
#        :rtype void
#        """
#
#    def getInteger(self):
#        """
#        @return the single integer that this NestedInteger holds, if it holds a single integer
#        Return None if this NestedInteger holds a nested list
#        :rtype int
#        """
#
#    def getList(self):
#        """
#        @return the nested list that this NestedInteger holds, if it holds a nested list
#        Return None if this NestedInteger holds a single integer
#        :rtype List[NestedInteger]
#        """
class Solution:
    def depthSumInverse(self, nestedList: List[NestedInteger]) -> int:
        res, level_sum = 0, 0
        while nestedList:
            next_level = []
            for n in nestedList:
                if n.isInteger():
                    level_sum += n.getInteger()
                else:
                    next_level.extend(n.getList())
            nestedList = next_level
            res += level_sum
        return res

上一题