【发布时间】:2017-12-19 15:50:54
【问题描述】:
假设我有以下集合A={1,2,3}
现在我想创建一个数组列表,使我的输出看起来像
(如果我们只允许 1 个负值)
{-1,2,3}, {1,-2,3}, {1,2,-3}
(如果我们只允许 2 个负值)
{-1,-2,3}, {-1,2,-3}, {1,-2,-3}
...等等。
到目前为止,我尝试了当我有 1 个负值时,它有效。 我使用了两个 for 循环,如下所示
ArrayList<ArrayList<Integer>> outer = new ArrayList<ArrayList<Integer>>();
for (int j=0; j<neighbours.size(); j++)
{
outer.add(createDnf(neighbours, neighbours.get(j)));
}
protected ArrayList<Integer> createDnf(List<Integer> others, int dn) {
ArrayList<Integer> inner = new ArrayList<Integer>();
for (int j=0; j<others.size(); j++) {
if(others.get(j) == dn) {
inner.add(dn);
} else {
inner.add(-others.get(j));
}
}
return inner;
}
这里neighbours 包含与集合A 相同的整数列表。
如何使其适用于 2 个或更多负值?
谢谢!
【问题讨论】:
-
当心,p over q 增长很快。示例:如果您的列表有 50 个元素 (p),并且您允许 6 个负值 (q),那么您的输出将有 (50*49*48*47*46*45)/(1*2*3*4*5 *6)=15,890,700 个值。
-
想知道这是否是回溯算法的情况,从第一个元素开始,使其成为-ve,然后处理剩余的元素。