你想想
把集合s的元素先进行一次堆排序变成一个有序表,
(heap sort O(n)~nlgn)
然后从第一个元素开始,比如5,那么你应该查找n-5,
然后对这个有序表用二分查找n-5(或者插值法,分块法都行)
(binary search O(n)~ lgn)
如果找到了,就把n和n-5都从表内删除,放在结果集里
如果没找到,什么也不做
查找完这个元素,在查找下一个元素
最坏情况下,一共要查找n次
n个二分查找 O(n)~ n*lgn
最终,O(n)~ nlgn这些算法,书上都有,不用我给你写代码了吧?
把集合s的元素先进行一次堆排序变成一个有序表,
(heap sort O(n)~nlgn)
然后从第一个元素开始,比如5,那么你应该查找n-5,
然后对这个有序表用二分查找n-5(或者插值法,分块法都行)
(binary search O(n)~ lgn)
如果找到了,就把n和n-5都从表内删除,放在结果集里
如果没找到,什么也不做
查找完这个元素,在查找下一个元素
最坏情况下,一共要查找n次
n个二分查找 O(n)~ n*lgn
最终,O(n)~ nlgn这些算法,书上都有,不用我给你写代码了吧?
将集合S用数组存储。设s有m个数
若m较大,则用堆排序,O(mlogm);
否则,用快速排序,平均时间kmlnmstep 2:找两者之和为n的数 (设无相同的数)
i=0;
j=m-1;
while(i<=j){
if(s[i]+s[j]==n){
println("d% d%",i,j);
i=i+1;
j=j+1;
}
else if(s[i]+s[j]<n) i=i+1;
else if(s[i]+s[j]>n) j=j-1;
}
其时间复杂度为mso,the tatal complexity no more than mlogm
必须排序,否则不能用binary search
你的算法是错误的