有没有办法计算列表列表中的路由数量?规则是在每个子列表中选择一个元素以形成列表,并且新列表中的值是升序的。 (列表或子列表的长度不固定)
如参见。 列表是
[[1, 10], [5, 16], [3, 20]]
有三种方法可以满足要求:
[1, 5, 20]
[1, 16, 20]
[10, 16, 20]
答案 0 :(得分:4)
您可以根据起始元素使用某种递归。为提高效率,请添加memoization,can 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
。
然后有两点:
递归编码num_routes_starting_with
并不困难。因为您使用的list_of_lists[0]
中的任何元素(很容易找到 - 只需检查它是否小于starting_elem
),您只需要routes_starting_with
调用list_of_lists[1: ]
}和starting_elem
替换为您刚刚使用的元素。您需要返回返回值的总和。
一旦你有了num_routes_starting_with
,就可以很容易地将它包装在一些顶级routes
中 - 只需:
一个。如果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)