输入n(n<=1000)个整数,找出其中的两个数,他们之和等于整数m(假定肯定有解)。题中所有整数都能用int表示
解法1:
用两重循环,枚举所有的取数方法,复杂度是O(n^2)的。
for(int i=0;i<n-1;++i)
for(int j=i+1;j<n;++j)
if(a[i]+a[j]==m)
break;
100000^2=100亿,在各种OJ上提交或参加各种程序竞赛,这样的复杂度都会超时!
解法2:
(1)将数组排序,复杂度是O(nlog(n))
(2)对数组的每个元素a[i],在数组中二分查找m-a[i],看能否找到。复杂度log(n),
最坏要查找n-2次,所以查找这部分复杂度也是O(nlog(n))
解法3:
(1)将数组排序,复杂度是O(nlog(n))
(2)查找的时候,设置两个变量i和j,i的初值是0,j的初值是n-1。看a[i]+a[j],
如果大于m,就让j减1,如果小于m,就让i加1,直至a[i]+a[j]=m.
这种解法的总的复杂度是O(nlog(n))的。