求指导一道算法题对否
题目是让你从一堆数中选出a,b,c三个数,判断是否有a+b=c。
我的想法是先对他们进行排序,然后第一个数从头到尾,然后第二个数从第二个开始往后,第三个从后往前。
但是总觉得不对,请指导。
sort(S);
for i=1 to n-3
a = S[i];
k = i+1;
l = n-1;
while (k<l)
b = S[k];
c = S[l];
if (a + b == c)
output a, b, c;
exit;
else if (a + b < c) then
k = k + 1;
else
return "no such three numbers";
[解决办法]
首先对整个数组建立集合,就是C++的set,建堆复杂度O(nlgn),目的是为了在O(lgn)的时间内查询某个数是否在集合中。
然后第一个数从头,第二个数从第二个,查询(a+b)是否在集合中。
复杂度O(nlgn + n^2lgn )
[解决办法]
l不动,一直是n-1?
堆真用不到。排序以后,枚举a,固定好a以后b和c可以线性扫出来,直接n^2了
[解决办法]
这堆数的最大值、最小值是多少?
如果差距不是太大,就COUNT一下各个数出现的次数。
任取a, b,计算c = a + b;
然后看看COUNT[c]>0就是有,COUNT[c] == 0就是没有。
排序、查找太烦
找COUNT[x]是否为0更快更爽,对吧
[解决办法]
for(int k=0, l=0; k<n && l<n;)
{
if (a+S[k] == S[l])
{
GotSolution;
k++, l++;
}
else if (a+S[k] < S[l]) k++;
else l++;
}