劍指offer 和為S的兩個數字

2021-10-23 05:39:11 字數 1095 閱讀 7438

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

對應每個測試案例,輸出兩個數,小的先輸出。
思路:充分利用有序的前提條件採用左右夾逼的思想,設定left = 0,right = len - 1,如果兩端元素之和大於sum,此時right左移,兩端元素之和可以減小;如果兩端元素之和小於sum,left右移,此時兩端元素之和可以增大。否則兩端元素之和等於sum,直接輸出,因為數字相差越大,乘積越小。

考慮1,3,5,7,8,9,11,設定i=1,j=7,sum=15

第一步:1+11=12<15,i++

第二步:3+11=14<15,i++

第三步:5+11=16>15,j--,(好奇,i--同樣可以使得兩端元素之和減小,為什麼不是i--)

第四步:5+9=14<15,i++,(好奇,j++同樣可以使得兩端元素之和增大,為什麼不是j++)

第五步:7+9=16>15,j--,(好奇,i--同樣可以使得兩端元素之和減小,為什麼不是i--)

第六步:7+8=15=15,退出迴圈,得到結果

在第三四五步的時候,出現了三個疑問,下面來驗證一下此演算法的可靠性。

考慮a1,a2,a3,a4,a5,a6,a7,設定i=1,j=7

以  a3和a6為例,計算a3+a6,若a3+a6=sum,滿足條件退出;

若a3+a6a3+a6,但是該演算法步驟能夠進入到a3+a6的計算的前提條件是,a3+a7(乃至a8,a9,a10……)>sum,才導致right左移,right--才最終進入a6的判斷,因此不存在j++使得本情況下兩端元素之和=sum的情況,故必然是執行操作i++。

以一開始的例子為例,

第三步5+11=16>15之所以不執行i--的原因是,上一步已經判斷過3+11<15,才能執行i++進入到5+11的判斷,以此類推。

這樣寫出來的**就比較簡潔了,時間複雜度為o(n)。

vectorfindnumberswithsum(vectorarray, int sum) 

}return ve;

}

劍指offer 和為S的兩個數字

esmp esmp 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸出描述 esmp esmp 對應每個測試案例,輸出兩個數,小的先輸出。esmp esmp 首先,先考慮在遞增排序的陣列中找到兩個和為s的數字。這個思路...

劍指offer 和為S的兩個數字

題目描述 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸出描述 對應每個測試案例,輸出兩個數,小的先輸出。ps 拋物線開口向下,找到的第一組 相差最大的 就是乘積最小的,不需要比較 class solution in...

劍指offer 和為s的兩個數字

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。輸出描述 對應每個測試案例,輸出兩個數,小的先輸出。雙指標,乙個從左向右遍歷,乙個從右向左遍歷。coding utf 8 class solution deffindnum...