题目:
输入一个递增排序的数组 和 一个数字S,在数组中查找两个数,使得它们的和正好为S,如果有多对数字的和等于S,
输入两个数的乘积最小的。
解法:
1、证明:第一次找到的两个数为两个数的成绩最小。因为是排序好的数字。假设a<b<c<d;
有a+d =b+c =10;即有第一个数为x,第二个数为(sum-x),且x<sum-x;
乘积y=x(sum-x),sum为一个已知数。要已知y最小,实际就是验证一个开口向下的抛物线的初中数学问题。
即abs(sum/2-x)最大,乘积最小,即最左边或最右边出现的数就是最小的乘积。由于是排序数组,所以第一次出现的即为最小乘积组合。
2、思想为利用两个指针,左边从索引0的元素开始,右边从索引n-1的元素开始。从两侧缩小满足条件的范围即可。
代码如下:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> res;
if(array.size()==0 || array.empty())
return res;
int left = 0;
int right = array.size()-1;
while(left<right)
{
if(array[left]+array[right] == sum)
{
res.push_back(array[left]);
res.push_back(array[right]);
break;
}
else if(array[left]+array[right] <sum)
left++;
else
right--;
}
return res;
}