算导2.3-7--存在与否问题

问题:描述一个运行时间为Θ(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的变形。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值