列表列表中的路由数量

时间:2015-05-10 06:54:22

标签: python list

有没有办法计算列表列表中的路由数量?规则是在每个子列表中选择一个元素以形成列表,并且新列表中的值是升序的。 (列表或子列表的长度不固定)

如参见。 列表是

[[1, 10], [5, 16], [3, 20]]

有三种方法可以满足要求:

[1, 5, 20]
[1, 16, 20]
[10, 16, 20]

1 个答案:

答案 0 :(得分:4)

您可以根据起始元素使用某种递归。为提高效率,请添加memoizationcan be done in Python quite easily(请参阅下文评论中@abarnert指出的esp。functools.lru_cache。)

假设你有这样的功能:

def num_routes_starting_with(list_of_lists, starting_elem)

其中starting_elem是路线的起始元素。也就是说,从list_of_lists[0]获取的路线中的每个元素必须至少大于starting_elem

然后有两点:

  1. 递归编码num_routes_starting_with并不困难。因为您使用的list_of_lists[0]中的任何元素(很容易找到 - 只需检查它是否小于starting_elem),您只需要routes_starting_with调用list_of_lists[1: ] }和starting_elem替换为您刚刚使用的元素。您需要返回返回值的总和。

  2. 一旦你有了num_routes_starting_with,就可以很容易地将它包装在一些顶级routes中 - 只需:

  3. 一个。如果list_of_lists为空,则答案为0)。

    湾如果不是,请选择list_of_lists[0]中的最小元素,从中减去1,然后使用numroutes_starting_with和减法结果调用list_of_lists

    以下是它的外观:

    def num_routes(list_of_lists):
        if len(list_of_lists) == 0:
            return 0
    
        return num_routes_starting_with(list_of_lists, min(list_of_lists[0]) - 1)
    
    # You should add here some memoization decorator, something like:
    # @memoized
    def num_routes_starting_with(list_of_lists, starting_elem):
        if not list_of_lists:
            return 1
    
        s = 0
        for e in list_of_lists[0]:
            if e > starting_elem:
                s += num_routes_starting_with(list_of_lists[1: ], e)
        return s
    
    list_of_lists = [[1, 10], [5, 16], [3, 20]]
    print num_routes(list_of_lists)