向量分区是将向量分割为一系列向量,以使它们的和为原始向量。这是几个分区:
[3, 1, 2] = [3, 1, 2]
[3, 1, 2] = [0, 0, 1] + [0, 0, 1] + [0, 1, 0] + [1, 0, 0] + [2, 0, 0]
[3, 1, 2] = [1, 1, 2] + [2, 0, 0]
在这里,矢量加法是逐个元素地完成的。有效分区不包含任何带有负整数的矢量或全零矢量。
现在的挑战是编写一个程序或函数,以给定目标向量生成所有可能的向量分区。这听起来相对容易...
...但是有一个转折。如果输入向量的大小为L,并且它生成的最大分区具有M个元素,则使用的内存不得超过O(L * M)。
您可以假定整数使用O(1)内存。这意味着您必须在生成分区时输出分区。最重要的是,每个分区只能输出一次。例如,这些是相同的分区:
[3, 1, 2] = [3, 0, 2] + [0, 1, 0]
[3, 1, 2] = [0, 1, 0] + [3, 0, 2]
如果您都输出,则您的答案均无效。
的所有分区[3, 2]
:
[3, 2]
[0, 1] + [3, 1]
[0, 1] + [0, 1] + [3, 0]
[0, 1] + [0, 1] + [1, 0] + [2, 0]
[0, 1] + [0, 1] + [1, 0] + [1, 0] + [1, 0]
[0, 1] + [1, 0] + [2, 1]
[0, 1] + [1, 0] + [1, 0] + [1, 1]
[0, 1] + [1, 1] + [2, 0]
[0, 2] + [3, 0]
[0, 2] + [1, 0] + [2, 0]
[0, 2] + [1, 0] + [1, 0] + [1, 0]
[1, 0] + [2, 2]
[1, 0] + [1, 0] + [1, 2]
[1, 0] + [1, 1] + [1, 1]
[1, 1] + [2, 1]
[1, 2] + [2, 0]
要测试您的答案,请在上运行它[3, 2, 5, 2]
。它应该生成17939个分区,所有分区的总和为[3, 2, 5, 2]
,并且都是唯一的(您可以通过按字典顺序对每个分区进行排序来测试唯一性)。
以字节为单位的最短代码获胜。