给定两个N长度数组,找到这些数组的N个长度组合,优先于B数组的元素。
例如,给定数组A: [1,2,3]
和B: [4,5,6]
的输入
Fun(A,B)
可能会产生:
[4, 5, 6] -> contains 3 from the B array
[4, 5, 3] -> contains 2 from the B array
[4, 2, 6] -> contains 2 from the B array
[1, 5, 6] -> contains 2 from the B array
[4, 2, 3] -> contains 1 from the B array
[1, 5, 3] -> contains 1 from the B array
[1, 2, 6] -> contains 1 from the B array
最重要的是,B阵列中的大多数元素在产生组合时首先出现。
P.S。我更喜欢K的线性运行时解决方案,其中K是可以创建的组合数(2^N
)。
答案 0 :(得分:2)
有2 ** N
个组合(或2 ** N - 1
你忽略了包含A
所有元素的组合,所以只列出它们的运行时间远远不是{{1}的线性}。
要生成它们,请注意每个组合对应一个N
- 位数,N
表示“从0
中取出元素”,A
表示“取”来自1
的元素。因此,生成所有B
位数,并根据popcount对它们进行排序。
可以直接以正确的顺序生成它们,并且指数空间复杂度为惩罚。
答案 1 :(得分:0)
解决方案可以构建如下:
从B的所有N个元素组合开始。
然后取B的所有N-1元素组合并合并 它们的元素为A.
然后从B中取出N-1个元素的所有组合,并将它们与从A中取得的2个元素的所有组合合并。
...
您可以在网上搜索组合数据的有效实现。如果需要,我可以提供一个简单的。