算法说明 - “嵌套列表权重总和”

时间:2017-02-12 21:13:45

标签: ruby algorithm

从Leetcode处理以下问题:

  

给定一个嵌套的整数列表,返回所有整数的总和   列表按其深度加权。

     

每个元素都是整数或列表 - 其元素可以是   也可以是整数或其他列表。

     

与上一个重量增加的问题不同   从根到叶,现在重量从下到上定义。即叶子   级别整数的权重为1,根级整数的权重为1   最重的。

     

示例1:给定列表[[1,1],2,[1,1]],返回8.(四个1位于   深度1,深度为2的一个2)

     

示例2:给定列表[1,[4,[6]]],返回17.(深度3处为1,   深度为2的一个4,深度为1的一个6; 1 * 3 + 4 * 2 + 6 * 1 = 17)

我的策略是在一次通过中找到深度,然后每个分支贡献(depth - branch_num)到总和。所以顶部分支=深度,第二个分支是深度 - 1,等等。这是我的代码:

# This is the interface that allows for creating nested lists.
# You should not implement it, or speculate about its implementation
#
#class NestedInteger
#    def is_integer()
#        """
#        Return true if this NestedInteger holds a single integer, rather than a nested list.
#        @return {Boolean}
#        """
#
#    def get_integer()
#        """
#        Return the single integer that this NestedInteger holds, if it holds a single integer
#        Return nil if this NestedInteger holds a nested list
#        @return {Integer}
#        """
#
#    def set_integer(value)
#        """
#        Set this NestedInteger to hold a single integer equal to value.
#        @return {Void}
#        """
#
#    def add(elem)
#        """
#        Set this NestedInteger to hold a nested list and adds a nested integer elem to it.
#        @return {Void}
#        """
#
#    def get_list()
#        """
#        Return the nested list that this NestedInteger holds, if it holds a nested list
#        Return nil if this NestedInteger holds a single integer
#        @return {NestedInteger[]}
#        """
#
# @param {NestedInteger[]} nested_list
# @return {Integer}
def depth_sum_inverse(nested_list)
    max_depth = max_depth(nested_list)
    depth_summation(nested_list, max_depth, 1)
end

def depth_summation(nested_list, max_depth, depth)
    sum = 0
    nested_list.each do |el|
        if el.get_integer.nil?
            sum += (max_depth - depth) + depth_summation(el.get_list, depth+1)
        else
            sum += el.get_integer*(max_depth - depth)
        end
    end
    sum
end 

def max_depth(nested_list)
    temp = 1 
    d = 1 
    nested_list.each do |el|
        temp = depth(el)
        if temp > d
            d = temp
        end
    end
    d
end


def depth(el)
    if el.is_integer
        return 1
    else 
        depth = 1 + depth(el.get_list)
    end

    depth    
end

开头注释掉的部分是为了帮助您理解“NestedInteger”类的API。

所以这就是我在努力的地方。我收到此错误消息:

  

第69行:'深度':未定义的方法'is_integer'为    (NoMethodError)。

当元素应该是NestedInteger类的对象时,该元素被重新枚举为数组。知道为什么会这样吗?

0 个答案:

没有答案