你想想
把集合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这些算法,书上都有,不用我给你写代码了吧?

解决方案 »

  1.   

    step 1:先排序
        将集合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
      

  2.   

    to hnalbert(再战)
    必须排序,否则不能用binary search
      

  3.   

    to strhusband()
    你的算法是错误的