题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。对应每个测试案例,输出两个数,小的先输出。
分析:最直观的想法是先找到满足条件的数组对,然后比较他们的乘积取乘积最小的一组,所以数组必须要遍历完,可是我们通过数学公式推导,发现a+b=sum,a和b越远乘积越小,而一头一尾两个指针往内靠近的方法找到的就是乘积最小的情况。如果是乘积最大的情况就是一直找到两个指针重合,每次找到一个就将之前返回的结果向量清空然后更新为新找到的。
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int size=array.size();
vector<int> ret;
if(size<=0)
return ret;
int flag=0;
int min=0;
for(int i=0;i<size;i++)
{
for(int j=i+1;j<size;j++)
{
if(array[i]+array[j]==sum)
{
flag++;
if(flag==1)//第一次进来
{
min=array[i]*array[j];
ret.push_back(array[i]);
ret.push_back(array[j]);
}
else//之后进来
{
if(array[i]*array[j]<min)
{
min=array[i]*array[j];
ret.clear();
ret.push_back(array[i]);
ret.push_back(array[j]);
}
}
}
}
}
return ret;
}
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int size=array.size();
vector<int> ret;
if(size<=0)
return ret;
int begin=0;
int end=size-1;
while(begin<end)
{
int s=array[begin]+array[end];
if(s==sum)
{
ret.push_back(array[begin]);
ret.push_back(array[end]);
break;
}
else if(s>sum)
{
end--;
}
else
{
begin++;
}
}
return ret;
}