又一次学习一遍<算法导论>,看到了这个问题:

描写叙述一个执行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和还有一个整数 X 时,推断出S中是否存在有两个其和刚好等于 X 的元素。

Solution

(1)->对整个集合进行排序,能够用快排(含有小文件策略、三者取中策略)。时间复杂度O(nlogn)。形成一个数组A[n]。

->设定两个下标pBegin和pEnd,分别指向数组A[n]的头尾。pBegin = 0。pEnd
= n -1。

->若(A[pBegin] +A[pEnd])==
X,找到元素对;

->若(A[pBegin]
+A[pEnd])> X。则表示所需的元素相应该要小一些,对于已经排好序的非降序数组,仅仅须要将--pEnd就可以;

->若(A[pBegin]
+A[pEnd])< X,则表示所需的元素相应该要大一些,仅仅须要将++pBegin就可以;

->直到 pBegin
 == pEnd 。总共的时间复杂度为O(nlogn+n),空间复杂度O(1)。

证明的思路:利用反证法。假如 (A[m] + A[k] )== X。初始化时,pBegin <= m。pEnd >= k。

首先证明在移动过程中pBegin 不可能大于m。假如pBegin 大于m,则在ipBegin 大于m之前。必有pBegin 必会有一次等于m,当pBegin 等于m时,pEnd 是大于k的,这时的A[pBegin]
+ A[pEnd] > X,所以pBegin 会一直停留在m处,直到pEnd 移动到k为止。所以pBegin 不会移动超过m。

同理能够证明pEnd 不会小于k,算法是正确。

(2)->对于较小的X。能够考虑利用Hash的思路。直接声明一个大小为X的数组S[X],初始化所有元素为0。

消耗X个辅助空间。

->遍历一次集合,对于全部小于等于X的元素k,令S[k]++。时间复杂度n;

->遍历数组S[X],对于不为0的元素下标m(S[m]!=0),查看S[X-m]是否为0。若m == X-m。查看S[m]>=2是否为真。

->总共的时间复杂度为O(X+n),空间复杂度O(X)。可是是在X较小的情况下。

->同一时候这种方法能够找出全部的元素对!

拓展问题

(1)是否存在三个元素之和正好等于给定值X?

【假如 A[m]+A[k]+A[s] == X。对于全部元素i,是否在集合S(除去i)中有两个元素之和等于 X-A[i]。n个元素相应n个上述的两个元素和的子问题。时间复杂度应该是O(nlogn+n^2)】不知是否有更好的思路?

(2)给定n个整数的集合S。输出集合S中全部满足 a+b=c 的整数a、b、c。

【类似1的解法。事实上就是 a+b-c=0的变形】

给定N个整数集合是否存在两个其和刚好为指定常数的元素的更多相关文章

  1. 跟着大彬读源码 - Redis 10 - 对象编码之整数集合

    [TOC] 整数集合是 Redis 集合键的底层实现之一.当一个集合只包含整数值元素,并且元素数量不多时,Redis 就会使用整数集合作为集合键的底层实现. 1 整数集合的实现 整数集合是 Redis ...

  2. 设计算法,求AB两个整数集合的交集

    [本文链接] http://www.cnblogs.com/hellogiser/p/ab-set-intersection.html [分析] 思路1:排序法 对集合A和集合B进行排序(升序,用快排 ...

  3. 对于给定的整数集合S,求出最大的d,使得a+b+c=d。

    对于给定的整数集合S,求出最大的d,使得a+b+c=d.a,b,c,d互不相同,且都属于S.集合的元素个数小于等于2000个,元素的取值范围在[-2^28,2^28 - 1],假定可用内存空间为100 ...

  4. 79 两个整数集合A和B,求其交集

    [本文链接] http://www.cnblogs.com/hellogiser/p/ab-intersect.html [题目] 两个整数集合A和B,求其交集. [分析]   1. 读取整数集合A中 ...

  5. C++程序设计实践指导1.5求两个整数集合并集改写要求实现

    改写要求1:改写为单链表结构可以对任意长度整数集合求并集 #include <cstdlib> #include <iostream> using namespace std; ...

  6. 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。

    描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 0 到 n-1. ...

  7. redis 系列8 数据结构之整数集合

    一.概述 整数集合(intset)是集合键的底层实现之一, 当一个集合只包含整数值元素,并且这个集合元素数量不多时, Redis就会使用整数集合作为集合键的底层实现.下面创建一个只包含5个元素的集合键 ...

  8. Redis实现之整数集合

    整数集合 整数集合(insert)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现.举个栗子,如果我们创建一个只包含五个 ...

  9. Redis 的底层数据结构(整数集合)

    当一个集合中只包含整数,并且元素的个数不是很多的话,redis 会用整数集合作为底层存储,它的一个优点就是可以节省很多内存,虽然字典结构的效率很高,但是它的实现结构相对复杂并且会分配较多的内存空间. ...

随机推荐

  1. 为MyEclipse加入自己定义凝视

    非常多时候我们默认的MyEclipse的类凝视是这种,例如以下图 能够通过改动MyEclipse的凝视规则来改变,不但能够改动类的.还能够改动字段.方法等凝视规则,操作方法例如以下 1.针对方法的凝视 ...

  2. oracle插入特殊字符&#39;&amp;&#39;问题

    oracle转义字符开关:set define off   /   show define

  3. JMeter脚本参数化和断言设置( CSV Data Set Config )

    用Badboy录制了Jmeter的脚本,用Jmeter打开后形成了原始的脚本.但是在实际应用中,为了增强脚本的多样性,就要使脚本参数化.这里我以登录为例,参数化用户账号与用户密码.  图1 :原始脚本 ...

  4. Sqlserver in 实现 参数化查询 XML类型

    原文: http://www.cnblogs.com/tangruixin/archive/2012/04/23/2465917.html 1:如果参数是int类型: declare @a xmlse ...

  5. Memory Analyzer Blog

    引用:http://memoryanalyzer.blogspot.jp/2008/05/automated-heap-dump-analysis-finding.html Dienstag, 27. ...

  6. iOS_SN_Socket网络编程(一)

    1.Socket简介 首先让我们通过一张图知道socket在哪里? socket在哪里 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口. 2.TCP和UDP的区别 在这里就 ...

  7. 1、java编程的建议,面试相关

    http://www.cnblogs.com/selene/p/5829605.html 面试相关:http://www.cnblogs.com/anrainie/p/5640208.html lin ...

  8. OpenGL ES 2.0 剪裁测试

    剪裁测试:可以在渲染时用来限制绘制区域,通过此技术可以在屏幕(帧缓冲)上指定一个矩形区域. //启用剪裁测试 GLES20.glEnable(GL10.GL_SCISSOR_TEST); //设置区域 ...

  9. 美化xterm

    很多软件调试时,会打开xterm,不过很难看,字体.背景等等都不好看,网上找到了一个不错的xterm的配置文件 !look and feel xterm.termName: xterm-256colo ...

  10. Bootstrap定制(一)less入门及编译

    第一篇博,希望支持. 近期在开发一个项目,项目前端定位于bootstrap,遂花了少许时间研究了bootstrap,将其整理整理,与众人共享. bootstrap官方的定制,功能还算完善,但是基于we ...