判斷集合中是否有兩個數的和等於某個給定整數

2021-07-24 23:07:22 字數 933 閱讀 2854

給定乙個整數的集合s, 有乙個整數x,判斷s中是否有兩個數相加等於x.

解法1《演算法導論》

解題步驟:

1.        對陣列s進行歸併排序。

2.        構造陣列s』=,並排序。由於s已經有序,構造與排序可一併完成。

3.        刪除s中重複的元素使僅保留乙個,對s』進行同樣的操作。

4.        合併s和s』,並保證合併後有序,這裡可以使用歸併排序的思想。

5.        如果在合併後的陣列中存在連續兩個相同的元素,並且這種元素的個數大於1,那麼有解。

設想在合併後的陣列中存在連續兩個w,則w分別屬於s和s』,那麼s中存在y使得w=x-y,即x=y+w。因此,s中元素w和y的和為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。

判斷集合S中是否存在兩個其和等於x的元素

演算法導論 第23頁練習2.3 7 請給出乙個執行時間為nlogn的演算法,使之能在給定乙個由n個整數構成的集合s和另乙個整數時,判斷出s中是否存在兩個其和等於x的元素。1 產生隨機數 2 合併排序,複雜度為nlogn 3 查詢符合要求的元素,複雜度為nlogn 總的複雜度為nlogn。includ...

陣列中是否有兩個數的和為10

給定乙個陣列,問其中是否有兩個數的和為10?原文的思路 1.比較任意兩個數的和是否為10。如 for int i 0 i n i 複雜度為o n n 2.將陣列排序後,對每個數m,使用二分查詢在陣列中尋找10 m。複雜度為o nlogn 3.將陣列儲存到hash set中去,對每個數m,在hash ...

判斷兩個陣列中是否有相同的元素 C語言

判斷兩個陣列中是否有相同的元素 方法一 用第乙個陣列的第乙個元素遍歷第二個陣列的每乙個元素,然後依次用第乙個陣列的第二個第三個等等元素遍歷陣列二的每乙個元素。include int main int arr2 int len1 sizeof arr1 sizeof arr1 0 int len2 s...