[英]Given an array, find all subsets which sum to value k
很简单的问题:
给定一个数组,找到总和为值k的所有子集
我正在尝试用Java执行此操作,并且似乎找到了可以在O(n ^ 2)时间内解决它的解决方案。 此解决方案是正确的O(n ^ 2)实现吗?
@Test
public void testFindAllSubsets() {
int[] array = {4,6,1,6,2,1,7};
int k=7;
// here the algorithm starts
for(int i = 0; i < array.length;i++){
// now work backwords
int sum = array[i];
List<Integer> subset = new ArrayList<Integer>();
subset.add(array[i]);
for(int j = array.length -1; j > i && sum < k; j--){
int newSum = sum + array[j];
// if the sum is greater, than ditch this subset
if(newSum <= k){
subset.add(array[j]);
sum = newSum;
}
}
// we won't always find a subset, but if we do print it out
if(sum == k){
System.out.print("{");
System.out.print(subset.get(0));
for(int l = 1; l < subset.size(); l++){
System.out.print(","+subset.get(l));
}
System.out.print("}");
System.out.println();
}
}
}
我已经通过各种示例对其进行了尝试,但没有发现任何可能破坏它的示例。 但是,当我在线搜索时,这似乎并不是该问题的常见解决方案,许多解决方案都声称此问题为O(2 ^ n)。
PS:这不是一个作业问题,我是一名笨拙的人,他的工作是尝试使用Java构建我的Comp Sci基础知识。 谢谢!
不,这不正确。以这个简单的例子为例
您的数组是4,6,1,2,3,1并且目标总和是7,那么在您的逻辑中它将仅找到您的代码会丢失的(4,3)(6,1)(1,2,3,1) (4,2,1),(4,3)。
我指的是通过维基
一个优雅的解决方案是简单地将一个子集视为每个成员在回答“我是否参加?”这个问题。 因此,基本上每个人都可以回答“是/否”,因此您有2个N子集(包括空子集)。 进行编码的最自然的方法是遍历每个元素并执行以下操作之一:
因此,时间复杂度为O(2 N )仅仅是因为您在最坏的情况下有这么多答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.