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

问题:亲给出一个运行时间为⊙(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数组。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值