算法導論2.3-7

[算法導論2.3-7]
轉自:http://www.cnblogs.com/xuxu8511/archive/2012/08/26/2657685.html
方法1、
先排序,然后比較:

int i=0,

j=n-1;
int b=0;
while (i<j)
{
    int k=s[i]+s[j];
    if (k==x) b=1,break;
    else if (k<x) i++;
    else j--;
}
if (b) printf("Y\n");
else printf("N\n");

nlgn+n=nlgn,即可以在規定時間內完成。

方法2、
先排序,時間復雜度為:o(nlgn)
S={y,y<x,y∈S},有序數組。
S'={z:z=x-y,y∈S},顯然S'也是一個有序數組。
然后,合并S、S’ 數組,如果存在兩個連續的相等值,也就是y1,y1,...,y2,y2 且y1+y2 = x,那么集合S中就存在兩個數的和為X。
那么,就存在y1+y2 = x,滿足條件。
為什么要存在兩個連續的相等值呢?
-------因為數是對稱的,如果存在y1,使得y1=x-y2,那么也有y2 =x-y1存在。
o(nlgn) +o(n) = o(nlgn)

同樣道理,找三個數之和也可以在n2時間內完成。sum=a[i]+b[i]+c[i];等價找兩個數其和為s=sum-a[i];共有n個,每個查找為線性時間n;nlgn+n2=n^2。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容