和為s的兩個數字 微軟面試100題 第十四題

2021-06-26 19:43:47 字數 1190 閱讀 9640

題目要求:

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,輸出任意一對即可。

例如輸入陣列和數字15.由於4+11=15,因此輸出4和11.

參考資料:劍指offer第41題

題目分析:

方法1 窮舉法:兩個for,時間複雜度o(n^2).

方法2 二分查詢法:逐個遍歷選乙個數,二分查詢選另乙個數,時間複雜度o(nlogn).

方法3 雙向掃瞄+臨時陣列法:先用輸入數字s依次減去原陣列a,組成乙個新陣列b:14、13、11、8、4、0.然後從陣列a左邊開始,b右邊開始掃瞄,小的移動,直到兩個數相等,則找到。a中位置的數為第乙個數,b中數的位置對應的a中位置的數為第二個數.

方法4 hash法:先用陣列建立乙個hash表。這樣,對於乙個輸入數字,只用遍歷一遍陣列就可以找到是否有這樣的兩個數。時間複雜度o(n).空間複雜度o(n).

方法5 雙向掃瞄:從兩端掃瞄,如果a[i]+a[j]>s,則j--,否則i++,如果最終找到a[i]+a[j] = s,則找到。

**實現:

#include using namespace std;

typedef struct pair

pair;

pair findsum(int *a, int n,int s);

int main(void)

; int n = sizeof(a)/sizeof(int);

int s = 15;

pair res = findsum(a,n,s);

if(res.i == -1)

cout << "not find" << endl;

else

cout << "find it,and the first number is " << res.i << ",the second number is " << res.j else if (*begin+*end

和為S的兩個數字

題目描述 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸入 每個測試案例包括兩行 第一行包含乙個整數n和k,n表示陣列中的元素個數,k表示兩數之和。其中1 n 10 6,k為int 第二行包含n個整數,每個陣列均為i...

和為S的兩個數字

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸出描述 對應每個測試案例,輸出兩個數,小的先輸出。class solution public vectorfindnumberswithsum vectorarray,i...

和為s的兩個數字

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸出描述 對應每個測試案例,輸出兩個數,小的先輸出。include using namespace std bool twonumberwithsum int data,i...