尋找和為定值的兩個數

2022-05-30 11:15:11 字數 1794 閱讀 5823

給定乙個陣列(無序或者有序,兩種情況都要考慮),找出和為m的兩個數。最多時間複雜度能有多少?

陣列有序的情況,在時間複雜度上我們就省去了排序的o(nlogn)。

我們使用兩端指標掃瞄法是比較簡單的,時間複雜度為o(n), 空間複雜度為o(1)。如下圖所示:

然後,判斷它們指向的值之和sum是否等於m,

如果sum如果sum>m, begin往中間移動。

直到,begin>end,返回結果~

總共的時間複雜度就是很厲害的o(n), 空間複雜度也只是o(1)。但是注意前提是陣列要有序~

程式如下:

#include #include 

using

namespace

std;

void twosum(int a,unsigned int length,int

sum)

else

else}}

}int

main()

; sort(a,a+7

); twosum(a,

7,15

);

return0;

}

如果需要輸出滿足所有條件的整數對

在上面**基礎上新增:

#include #include 

using

namespace

std;

void twosum(int a,unsigned int length,int

sum)

else

else}}

}int

main()

;

int len=sizeof(a)/sizeof(int

); sort(a,a+len);

twosum(a,len,

15);

return0;

}

當陣列無序的時候,當時我們可以先排序, 然後再使用上面的方法。這是時間複雜度為o(nlogn),空間複雜度為o(1)。

或者我們還可以使用對映hash表或者陣列,詳細來說:

把陣列m - a[i]對映到乙個hash表或者是乙個陣列,然後我們就判斷原陣列和陣列m - a[i]時候有元素相等,如果則返回結果。判斷相等的方法我們也可以使用兩端夾逼方法。

這種方法的時間複雜度為o(n), 空間複雜度為o(n)。

ps:其實在無序的情況,還是對映到hash表比較好,對映到陣列也不是很好操作~

#include using

namespace

std;

const

int size=100

;int

main()

;

for(int i=0;i<7;i++)

hashtable[a[i]]=1

;

int sum=15

;

for(int i=0;i<7;i++)

if(hashtable[i]&&hashtable[sum-i])

cout

<

這兩個數為""

else

cout

<

不存在這樣的兩個數.

"<

return0;

}

尋找和為定值的兩個數

尋找和為定值的兩個數 給定乙個陣列 無序或者有序,兩種情況都要考慮 找出和為m的兩個數。最多時間複雜度能有多少?陣列有序的情況,在時間複雜度上我們就省去了排序的o nlogn 我們使用兩端指標掃瞄法是比較簡單的,時間複雜度為o n 空間複雜度為o 1 如下圖所示 然後,判斷它們指向的值之和sum是否...

尋找和為定值的兩個數

描述 輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。分析 如果採取窮舉,複雜度為o n 2 可以換乙個思...

尋找和為定值的兩個數

題目 輸入乙個陣列和乙個數字,在陣列中查詢兩個數,使得它們的和正好是輸入的那個數字。要求時間複雜度是o n 如果有多對數字的和等於輸入的數字,輸出任意一對即可。例如輸入陣列1 2 4 7 11 15和數字15。由於4 11 15,因此輸出4和11。解析 如果陣列是無序的,先排序 n logn 然後用...