zoukankan      html  css  js  c++  java
  • 给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X

    题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X

    思路一:

    1,先采用归并排序对这个数组排序,

    2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的位置,如果sum=x则返回true,

    3,找到位置后,保持i不变,从k处向前遍历,直到找到A[k]+A[i]等于x,并返回TRUE,如果找不到,则返回false。

    论证步骤3:当前找到的位置恰好A[k]+A[i]>x,且前一位置的sum<x;

           所以A[i]前面的数(不包括A[i])无论取哪两个数都不可能使和等于x,只能小于x

           对位置k向前寻找时,当寻找到A[k]+A[i]=sum,返回true;当寻找到sum<x时,令k=i,跳出对k的循环,继续寻找

           当所有的路径寻找完之后,返回false,没找到

    代码如下:

     1     public boolean ExitSumX(int A[],int x)
     2     {
     3         //归并排序
     4         MessSort(A);
     5          
     6         int k=0;
     7         for(int i=1;i<A.length;i++)
     8         {
     9             if(i!=k)
    10             {
    11                 if(A[k]+A[i]==x)
    12                     return true;
    13                 else if(A[k]+A[i]<x)
    14                     k=i;
    15                 else
    16                 {
    17                     while(k>0)
    18                     {
    19                         k--;
    20                         if(A[k]+A[i]==x)
    21                             return true;
    22                         else if(A[k]+A[i]<x)
    23                             { k=i;break; };
    24 } 25 } 26 } 27 } 28 return false; 29 }

    算法分析:归并排序时间为:O(nlgn),寻找算法时间复杂度为O(n2),算法整体时间复杂度为:O(n2),可见算法不算太好

    思路二:

    这种算法时间复杂度为O(nlgn),思路来自 算法导论

  • 相关阅读:
    java泛型
    转载:MSIL Instruction Table
    What if your dynamic sql statement is too long?
    自己第一个正儿八经的div+css页面
    bulk insert formatFile格式记录
    日志 20071221(WCF,using keyword)
    C++点滴
    The scripts used to generate a demo "School" database (with data)
    The typical scenarios of using "Insert" in Tsql
    如何生成任意给定区间的随机值序列
  • 原文地址:https://www.cnblogs.com/justinjia/p/3980173.html
Copyright © 2011-2022 走看看