• 给定数组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),思路来自 算法导论

  • 相关阅读:
    isa与hasa的关系
    两道笔试题的解法
    无耻的WoW打钱工作室
    我正处于恶性循环中——读wowar上的一篇帖子有感
    snippets from ObjectOriented Thought Process (1)
    使用C#获取当前Windows所设定的时区
    用ASP.NET模拟Windows Service来实现定时提醒之类的功能
    乱说 缓存
    认识数据库连接
    网站sql注入的技巧与防范
  • 原文地址:https://www.cnblogs.com/justinjia/p/3980173.html
Copyright © 2020-2023  润新知