和為S的兩個數字

2021-09-25 19:23:14 字數 794 閱讀 7328

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。

對應每個測試案例,輸出兩個數,小的先輸出。
思路:雙指標操作,乙個指向開頭,乙個指向末尾。根據兩者數字和的大小移動指標,比如

1 2 4 7 11 15 查詢和為15的數對

i指向1, j指向15,兩者和16大於15,所以j--

此時1 + 11 = 13, 小於15所以i++

此時4+11= 15,退出程式,此時得到的數對的乘積是最小的,證明如下,

設x,y,,   x + y =sum (i)    (sum是滿足條件的和)

不妨設y > x,(畢竟題目說陣列的資料是遞增的),

y - x =d>0(ii) 由(i) 和(ii)

2y = sum + d;

y = (sum + d)/2;

x = y -d = (sum - d) / 2;

所以x * y = (sum^2 - d^2) / 2;

sum是乙個定值,所以當d越大的時候乘積越小,我們的i是從陣列頭開始的,j是從陣列尾部開始的,而且陣列是遞增的,

從而保證我們的d (d是y - x 的差值)是從大到小的,所以如果我找到第乙個滿足的數對,其實就已經找到結果了

class solution 

else if(array[i] + array[j] < sum)

else

}return res;

}};

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