27 和為S的兩個數字

2022-04-27 10:54:10 字數 1218 閱讀 6486

0 引言

題目描述:輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。
1 抽象問題具體化

舉例: 序列為, 和為10

解答:如下圖所示,一頭一尾兩個指標分別運動,找到和為10的兩個數,並比較其乘積,得到乘積最小的兩個數作為結果輸出。

1*9 = 9;

2*8 = 16;

3*7 = 21;

4*6 = 24;

2 具體問題抽象分析

演算法描述:設序列為array,和為sum

(1)將兩個指標初始化為序列頭(p)尾(q)兩項;

(2)如果兩個數的和小於sum(array[p] + array[q] < sum),則考慮增大p,使得和值增大;

(3)如果兩個數的和大於sum(array[p] + array[q] > sum),則考慮減小q,使得和值減小;

(4)如果兩個數的和等於sum(array[p] + array[q] == sum),則考慮增大p或者減小q,使得遍歷繼續,同時根據兩數的乘積更新最小乘積以及輸出值;

(5)返回結果

3 demo

/*

尋找遞增序列中和為sum的兩個數

* 輸入1: vectorarray,遞增序列

* 輸入2: int sum, 和

* 輸出: vector格式,兩個數,其和等於sum,乘積最小

* 演算法思路描述:一頭一尾兩個指標分別運動,記錄其和值中乘積最小的乙個

*/vector

findnumberswithsum(vector array,int

sum) ;

if(array.size() < 2

)

int minmultiplication = pow(array[array.size()-1],2

);

for(int p=0, q=(int)array.size()-1; p !=q;)

-- q; //

或者++ p;

}

}if(twonums[0] == 0 && twonums[1] == 0

) twonums.clear();

return

twonums;

}

4 **優化

和為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...