我有以下列表列表< List< Integer>>
1 2 3 4 5 6 7 8 9 10
我必须将这个列表列表随机分组为3个子集,每个子集有4个元素(从不在最后一个子集中我将少于4个元素),并且在每个子集中我都不能拥有来自同一行的元素(i例如,不能有3 4 5 7)。应该是什么基本算法????
答案 0 :(得分:4)
什么应该是基本算法????
从列表列表中随机选择的前四个 1 中的每一个中取出四个随机元素。删除所选项目,然后重复下一个子集。随时删除空列表。
接下来,您需要注意并非所有输入都是可解决的:
1
2
3
4
5 6 7 8 9
在这种情况下,我们随机选择
1*
2*
3*
4
5 6 7 8 9*
- > 7 1 2 3(随机选择)
[]
[]
[]
4*
5 6 8 9*
- > 5 4。 。 < - 呃,即使非空列表仍然存在,也无法从不同的列表中选择四个项目。您可以在迭代期间检测到这一点。
1 :或者,如果剩下的非空列表少于四个,则从所有列表中随机选择。
答案 1 :(得分:0)
最简单的答案是执行随机选择,检查是否违反了“两个来自同一个”规则。如果是,那就扔掉再试一次。
答案 2 :(得分:0)
按元素数量对列表进行排序。
选择4个元素,每个元素中包含4个元素。
场。
从2开始重复。
heap可以提供帮助。
为什么我们需要从包含最多元素的列表中选择?
考虑这种情况:
1 2
3 4
5 6
7
8
如果我们选择7和8,我们将留下类似的东西:
1 2
3
5
从这里开始,没有办法从不同的列表中选择4个元素。
但是,如果我们从具有最多元素的列表中选择元素,我们将留下类似的内容:
1
3
5
8
从这里我们可以从每个列表中选择一个元素。