问题
假设你有n个整数列表,每个列表中的整数都在1到n范围内。例如,当n = 4时,我们可能有以下列表:
a_1 = [1, 2]
a_2 = [3]
a_3 = [4, 1, 1]
a_4 = [2, 3]
现在我的问题是:我能否在这些n个列表中勾选掉1到n之间的所有整数,但有一个限制条件,即一旦我找到一个数字,就不能再使用该列表来查找后续数字?
例如,在上面的n = 4的示例中,我可以从a_1选择1,从a_4选择2,从a_2选择3,从a_3选择4,因此我填满了从1到4的所有数字,但只使用每个列表一次。
找不到区间的示例(因此应返回False)如下所示:
a_1 = [1, 2]
a_2 = [3, 3, 5]
a_3 = [4]
a_4 = [5]
a_5 = [3, 4, 5]
原因是如果我从a_1中选择1,就不能再从任何列表中选择2了。
方法
这是我当前的直接方法。我将列表进行笛卡尔积,并检查是否有任何一个在排序后成为一个范围。
import itertools
def fillRange(lists):
cartesian = itertools.product(*lists)
return any([sorted(comb) == range(1, len(lists) + 1) for comb in cartesian])
问题
虽然我的方法是可行的,但对于大型列表来说有些低效。您有什么改进算法的想法吗?
谢谢!
list(range(1, len(lists) + 1))
来获取一个列表。 - Chris_Rands