题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述
对应每个测试案例,输出两个数,小的先输出。
题目分析
主要采用双指针的方法,通过二分法查找到合适的值。
时间复杂度:O(logn * logn)
空间复杂度:O(1)
代码
C++代码如下:
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum)
{
vector<int> result;
if(!array.size())
return result;
int left=0;
int right=array.size()-1;
int l,r,m,t;
while(left<right-1)
{
if(array[left]+array[right]==sum)
{
result={array[left],array[right]};
return result;
}
else if(array[left]+array[right]>sum)
{
t=sum-array[left];
l=left+1;
r=right;
while(l<r)
{
m=(l+r)/2;
if(array[m]==t)
{
result={array[left],array[m]};
return result;
}
else if(array[m]>t)
{
r=m;
}
else
{
l=m;
}
if(l>=r-1)
break;
}
right=l;
}
else
{
t=sum-array[right];
l=left;
r=right-1;
while(l<r)
{
m=(l+r+1)/2;
if(array[m]==t)
{
result={array[m],array[right]};
return result;
}
else if(array[m]>t)
{
r=m;
}
else
{
l=m;
}
if(l>=r-1)
break;
}
left=r;
}
}
return result;
}
};