求集合S中两个元素的和为整数X

来源:互联网 发布:mac sdk路径 编辑:程序博客网 时间:2024/05/22 03:14

问题:亲给出一个运行时间为⊙(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。


解决方法:

1,首先对n个元素排序(归并排序或者堆排序),时间复杂度为⊙(nlgn);

2,令Xi = A[i], Xj = A[j],初始化i = 0, j = n - 1 

按照如下规则进行:

if Xi + Xj < X

then i++

if Xi + Xj > X

then j--

if Xi + Xj == X

then print Xi and Xj

虽然感觉会是正确的,但是需要系统的证明,利用反证法,假如排序后的数组A,A[m] + A[k] == X,初始化时,i <= m, j >= k,首先反证在移动过程中i不可能大于m,假如i大于m,则在i大于m之前,必有i必会有一次等于m,按照移动规则,i等于m时,j是大于k的,这时的A[i] + A[j] > X,所以i会一直停留在m处,知道j移动到k为止,所以i不会移动超过m,同理可以证明j不会小于k,则算法是正确。


PS:另一种方案采用数组T[X],其中X为要求的两元素之和,遍历n个元素,设置T[A[i]] == 1,最后遍历T[X]数组,如果T[i] == 1,则检查T[X - i] == 1,如果等于1,说明存在,说明存在两元素的和等于X,知道检查所有的T数组。

原创粉丝点击