思路:
递增数列,设两个头尾指针 i 和 j ;
若ai + aj == sum,就是答案(相差越远乘积越小)
若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1
若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1
O(n)
输出两个数的乘积最小的。这句话的理解?
假设:若b>a,且存在,
a + b = s;
(a - m ) + (b + m) = s
则:(a - m )(b + m)=ab - (b-a)m - m*m < ab;说明外层的乘积更小。
因此只要找到第一对和为s的数字就行了,这个乘积也是最小的。
1 class Solution { 2 public: 3 vector<int> FindNumbersWithSum(vector<int> array,int sum) { 4 vector<int> res; 5 if(array.size()<2) return res; 6 int a = 0; 7 int b = array.size()-1; 8 while(a<b){ 9 if(array[a]+array[b]==sum){ 10 res.erase(res.begin(),res.end()); 11 res.push_back(array[a]); 12 res.push_back(array[b]); 13 break; 14 } 15 if(array[a]+array[b]<sum) a++; 16 if(array[a]+array[b]>sum) b--; 17 } 18 return res; 19 } 20 };