问题:描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素。(代码就不写了,比较简单)
方法一:使用归并排序+二分查找,具体步骤如下:
(1)对集合S进行归并排序(非降序);
(2)从集合S中选择一个元素S(i),计算x与S(i)的差值y=x-S(i)。在集合S中查找除S(i)之外的元素中是否存在y,如果存在,则返回;
(3)检查是否全部元素已遍历,如果没有跳到第2步。
验证该思路的运行时间复杂度:第(1)步使用归并排序来排序,时间复杂度为Θ(nlgn);二分查找的时间复杂度为Θ(lg(n)),第(2)、(3)步需要遍历的次数为n,因此第(2)、(3)步的时间复杂度为Θ(nlgn),因此总的时间复杂度为Θ(nlgn),符合问题的要求。
方法二:使用归并排序+首尾查找,具体步骤如下:
(1)对集合S进行归并排序(非降序),并用数组A[n]存储;
(2)设定下标i=0,j=n-1;
(3)循环判断A[i]+A[j] 与x大小:若A[i]+A[j] == x,则返回true;
若A[i]+A[j] > x,则j=j-1,转(4);
若A[i]+A[j] < x,则i=i+1,转(4);
(4)检查i<j是否成立,若成立则返回(3)继续;否则返回false。
扩展:1.是否存在三个元素之和正好等于给定值X?
思路:假如 A[m]+A[k]+A[s] == X,对于所有元素i,是否在集合S(除去i)中有两个元素之和等于 X-A[i],n个元素对应n个上述的两个元素和的子问题。时间复杂度应该是O(n^2logn+n^2)。
2.给定n个整数的集合S,输出集合S中所有满足 a+b=c 的整数a、b、c。
思路:类似1的解法,其实就是 a+b-c=0的变形。