輸入乙個遞增排序的陣列和乙個數字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...