zoukankan      html  css  js  c++  java
  • [LeetCode]364. 加权嵌套序列和 II (DFS)

    题目

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

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

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

    也就是说,在本题中,叶子的权重为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。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/nested-list-weight-sum-ii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    题解

    使用两遍DFS,第一遍计算出最大深度,第二遍计算加权和。
    PS:若是深度计算方式相反,则只需一遍DF计算加权和。

    代码

    /**
     * // 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 null if this NestedInteger holds a single integer
     *     public List<NestedInteger> getList();
     * }
     */
    class Solution {
        private int maxDepth=0;
    
        public int depthSumInverse(List<NestedInteger> nestedList) {
            updateMaxDepth(nestedList,1);
            return getDepthSum(nestedList,1);
        }
    
        private void updateMaxDepth(List<NestedInteger> nestedList,int depth){
            for(NestedInteger nestedInteger:nestedList){
                if(nestedInteger.isInteger()){
                    maxDepth=depth>maxDepth?depth:maxDepth;
                }
                else {
                    updateMaxDepth(nestedInteger.getList(),depth+1);
                }
            }
        }
    
        private int getDepthSum(List<NestedInteger> nestedList,int depth){
            int sum=0;
            for(NestedInteger nestedInteger:nestedList){
                if(nestedInteger.isInteger()){
                    sum+=(maxDepth-depth+1) * nestedInteger.getInteger();
                }
                else{
                    sum+=getDepthSum(nestedInteger.getList(),depth+1);
                }
            }
            return sum;
        }
    }
    
  • 相关阅读:
    [CQOI2005]三角形面积并(计算几何+扫描线)
    第一天
    LA3026 周期 (kmp)
    HDU 1715 大菲波数 (java大数)
    根据身高重建队列(vector)
    K 连续位的最小翻转次数
    724. Find Pivot Index
    Two Sum
    c
    Most Powerful(状压DP水题)
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/12306019.html
Copyright © 2011-2022 走看看