假设我有一个元素列表[1,2,3,4,]
和一些箱子(我们假设有2个箱子),我想提出一个将项目1-4拆分成2个箱子的所有组合的列表。解决方案看起来应该是这样的
[{{1}, {2,3,4}}, {{2}, {1,3,4}}, {{3}, {1,2,4}}, {{4}, {1,2,3}},
{{1,2}, {3,4}}, {{1,3}, {2,4}}, {{1,4}, {2,3}}, {{}, {1, 2, 3, 4}, {{1, 2, 3, 4}, {}}]
此外,订单确实很重要 - 我没有写出所有的返回值,但{{1, 2, 3}, {4}}
是与{{3, 2, 1}, {4}}
不同的解决方案
答案 0 :(得分:3)
一种常见的方法如下。
如果您有K
个分区,请在初始数组中添加K-1
个特殊值。我将使用-1
值,假设它永远不会出现在初始数组中;你可以选择不同的价值。
因此,对于您的示例,初始数组变为arr=[1,2,3,4,-1]
;如果K
是4
,则数组将为arr=[1,2,3,4,-1,-1,-1]
。
现在列出数组arr
的所有排列。对于每个排列,将所有-1
视为bin分隔符,因此所有元素都是第一个-1
转到第一个bin(按特定顺序),第一个和第二个{{1之间的所有元素转到第二个bin,依此类推。
例如:
-1
等等。
生成所有排列是一项标准任务(例如,参见Permutations in JavaScript?),并且按[-1,1,2,3,4] -> {{}, {1,2,3,4}}
[2,1,3,-1,4] -> {{2,3,4}, {4}}
[3,1,2,-1,4] -> {{3,1,2}, {4}}
[1,3,-1,2,4] -> {{1,3}, {2,4}}
分割数组应该很容易。