我遇到的问题是子集求和问题的一个非常明确的例子:
“给定[-65000,65000]范围内的整数列表,如果列表的任何子集总和等于零,则该函数返回true。否则返回False。”
我想问的更多的是解释而不是解决方案。
这是我在考虑问题的复杂性之前提出的特定于实例的解决方案。
while(A[low]<0){
sum = extSum;
if(extSum>0){
while(sum - A[high] < sum){
tmp = sum - A[high];
if(tmp==0) return true;
else if(tmp > 0){
sum = tmp;
high--;
}
else{
high--;
}
}
extSum -= A[low];
low++;
high = n - 1;
}
else{
/* Symmetric code: switch low, high and the operation > and < */
}
}
return false;
首先,这个解决方案是否正确?我做了一些测试,但我不确定......看起来太容易了...... 这个代码的时间复杂度是不是O(n ^ 2)?
我已经阅读过各种DP解决方案,我想了解的是,对于我所面临的问题的具体实例,它们比这个天真直观的解决方案要好得多。我知道我的方法可以得到很大的改善,但是当谈到时间复杂性时,没什么可以产生很大的不同......
感谢您的澄清
编辑:一个明显的优化是,在排序时,如果找到0,则该函数立即返回true ....但它仅适用于其中有0的特定情况数组。
答案 0 :(得分:-1)
嗯,我认为{0}会胜过你的答案。
因为它会简单地忽略while并返回false。