和为s的两个数字

思路:

递增数列,设两个头尾指针 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 };

 

 
 
 
 
 
posted @ 2019-07-18 11:12  Austin_anheqiao  阅读(143)  评论(0编辑  收藏  举报