【发布时间】:2022-01-22 09:15:09
【问题描述】:
如果输入,我有一个这样的列表列表
[[2,1], [1,3], [4,5], [6,8], [4,7]]
我怎样才能找到一个/最大的子集,使得根本没有重复/共享元素?
对于这个例子,答案是
[2,1], [4,5], [6,8]
或
[1,3], [6,8], [4,7]
但是一个无效的答案会是
[2,1],[1,3],[4,5]
因为 1 在这里出现了两次。
我目前的方法是一种递归方法,它使用的想法是要么选择第一个元素,要么在构建子集时不选择第一个元素,但这种方法似乎太慢了。
我所拥有的:目前它只返回最大子集的大小而不是实际子集的大小,但是一旦大小起作用,应该很容易得到它
def disjointSets(allSets):
maxCount = 0
used = set()
def findDisjoint(currCount, arr):
nonlocal maxCount
if not arr:
maxCount = max(maxCount, currCount)
return
elif arr[0][0] in used or arr[0][1] in used:
findDisjoint(currCount, arr[1:])
return
else:
used.add(arr[0][0])
used.add(arr[0][1])
findDisjoint(currCount + 1, arr[1:])
used.clear()
findDisjoint(currCount, arr[1:])
return
findDisjoint(0, allSets)
return maxCount
【问题讨论】:
-
告诉我们你做了什么
-
这是Knapsack problem的变体之一
-
内部列表是否总是正好有两个值?
-
@mozway 哪一个,最佳时间复杂度是多少?
标签: python arrays list algorithm