演算法題(二十八) 和為S的兩個數

2021-08-31 18:35:59 字數 506 閱讀 7147

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

在陣列的頭部(h)和尾部(t)開始向內遍歷,若h+t小於s,則h肯定不是答案之一,因為不可能有數比t大了;若h+t大於s,則t肯定不是答案之一,因為不可能有數比h小了。而當第一次找到h和t時,這時的h*t也是最小的。

牛客網上解釋為:考慮x+y=c(c是常數),x*y的大小。不妨設y>=x,y-x=d>=0,即y=x+d, 2x+d=c, x=(c-d)/2, x*y=x(x+d)=(c-d)(c+d)/4=(c^2-d^2)/4,也就是x*y是乙個關於變數d的二次函式,對稱軸是y軸,開口向下。d是》=0的,d越大, x*y也就越小。

public class doublesum ;

findsum(arr, 11); }

public static void findsum(int arr, int sum)

while(h輸出:0,3

演算法題 和為s的兩個數字

題目 輸入乙個亂序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數。思路 1.輸入的是亂序陣列,先對陣列從小到大排序 2.small指向最小值,big指向最大值,sum small big 3,如果sum大於s說明big太大,將big指標左移一位,如...

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