zoukankan      html  css  js  c++  java
  • 判断集合中是否有两个数的和等于某个给定整数

    给定一个整数的集合S, 有一个整数x,判断S中是否有两个数相加等于x.

    解法1《算法导论》

    解题步骤:

    1.        对数组S进行归并排序。

    2.        构造数组S’={z : z=x-y, y∈S},并排序。由于S已经有序,构造与排序可一并完成。

    3.        删除S中重复的元素使仅保留一个,对S’进行同样的操作。

    4.        合并SS’,并保证合并后有序,这里可以使用归并排序的思想。

    5.        如果在合并后的数组中存在连续两个相同的元素,并且这种元素的个数大于1,那么有解。

    设想在合并后的数组中存在连续两个w,则w分别属于SS’,那么S中存在y使得w=x-y,即x=y+w。因此,S中元素wy的和为x

    步骤1的运行时间为Θ(n lg n),其余步骤运行时间为Θ(n),因此总的时间代价为Θ(n lg n)


    解法2:

    对S排个序O(nlgn),然后用两个指针p1,p2分别指向头尾,

    if(p1+p2 == x)
      return true;
    else if(p1 + p2 > x)
      p2--;
    else
      p1++;

    直到2指针相遇,如果没有找到,返回false

    注:感觉是对的,但是如何证明呢?真的没有漏洞吗知道的请给我留言

    解法3

    如果x不大的话.

    申请x大小的数组byte t[x],memset 0.

    遍历下集合S,对于小于x的数i将t[i]=1; 这是0(N);

    然后对数组t[x]遍历. 循环查找i对应的t[x-i]是否为1. 这是O(X)


    后记:

    同样道理,找三个数之和也可以在n^2时间内完成。
    sum=a[i]+b[i]+c[i];
    等价找两个数其和为s=sum-a[i];
    共有n个,每个查找为线性时间n;
    nlgn+n^2=n^2。

  • 相关阅读:
    redmine工作流程总结
    IOS_OC_Category
    权限问题导致无法删除ftp文件
    Window下UDP(socket)接和收数据案例
    新一批创业者入局 谁来挖掘其身上的金矿
    java代理使用 apache ant实现文件压缩/解压缩
    ZOJ Monthly, November 2012
    【cocos2d-x 3.7 飞机大战】 决战南海I (十) 游戏主场景
    getAttribute for IE7
    Sahara中的数据模型
  • 原文地址:https://www.cnblogs.com/freewater/p/2162417.html
Copyright © 2011-2022 走看看