【发布时间】:2012-05-03 00:26:59
【问题描述】:
给定一组未排序的 n 整数,返回所有大小为 k 的子集(即每个集合有 k 个唯一元素)且总和为 0。
所以我给了面试官以下解决方案(我在GeekViewpoint上研究过)。没有使用额外的空间,一切都完成了,等等。但当然成本是 O(n^k) 的高时间复杂度,其中 k=tuple 在解决方案中。
public void zeroSumTripplets(int[] A, int tuple, int sum) {
int[] index = new int[tuple];
for (int i = 0; i < tuple; i++)
index[i] = i;
int total = combinationSize(A.length, tuple);
for (int i = 0; i < total; i++) {
if (0 != i)
nextCombination(index, A.length, tuple);
printMatch(A, Arrays.copyOf(index, tuple), sum);
}// for
}// zeroSumTripplets(int[], int, int)
private void printMatch(int[] A, int[] ndx, int sum) {
int calc = 0;
for (int i = 0; i < ndx.length; i++)
calc += A[ndx[i]];
if (calc == sum) {
Integer[] t = new Integer[ndx.length];
for (int i = 0; i < ndx.length; i++)
t[i] = A[ndx[i]];
System.out.println(Arrays.toString(t));
}// if
}// printMatch(int[], int[], int)
但随后她提出了以下要求:
- 必须在回答中使用 hashmap 以降低时间复杂度
- 必须绝对 -- 绝对 -- 为一般情况提供时间复杂度
- 提示当 k=6,O(n^3) 时
她对时间复杂性比其他任何事情都更感兴趣。
有人知道满足新约束的解决方案吗?
编辑:
假设,在正确的解决方案中,映射将存储输入的元素,然后映射用作查找表,就像k=2 的情况一样。
当子集的大小为 2(即k=2)时,答案很简单:循环并将所有元素加载到地图中。然后再次循环输入,这次在地图上搜索sum - input[i] where i is the index from 0 to n-1,这就是答案。假设这个微不足道的情况可以扩展到k 是什么。
【问题讨论】:
-
这里没有问题。尽管很有趣,但毫无疑问。您是否正在寻找一个考虑到附加约束的解决方案?
-
问:你的问题是?
-
编辑添加最后一行:
Does anyone know a solution that would satisfy the new constraints? -
问:你是说你实际上得到了一个你碰巧在 GeekViewpoint 上研究的面试问题?你能给面试官 20 多行工作代码吗?这很酷!由于时间复杂度,她将你标记为关闭?!?这不是有点像如果你的狗回答了法官的问题......用法语......但是法官因为你的狗没有正确地结合她的动词而给她打分?!?
-
@kasavbere - 我承认。我偶然发现了SO。我实际上是在互联网上寻找凯特厄普顿跳舞 Dougie 的视频;)阿尔·戈尔推荐它;)
标签: java time-complexity subset-sum