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。

  • 相关阅读:
    python,生产环境安装
    neo4j 图数据库
    RNN系列
    机器学习关于AUC的理解整理
    fensorflow 安装报错 DEPENDENCY ERROR
    dubbo Failed to check the status of the service com.user.service.UserService. No provider available for the service
    使用hbase遇到的问题
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk
    gradle 安装
    jenkins 安装遇到的坑
  • 原文地址:https://www.cnblogs.com/freewater/p/2162417.html
Copyright © 2011-2022 走看看