题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:对应每个测试案例,输出两个数,小的先输出。
思路:
定义两个指针,一个指向数组首元素,一个指向数组最后一个元素,计算两个元素的和,如果和小于sum,那么第一个指针向后移,反之,第二个指针向前移。
关于输出的描述:可以看一个例子,例如 1 2 3 4 5 6 7,sum = 8,可以看出复合要求的两个数字的乘积分别为:1*7=7,2*6=12,3*5=15.可以看出,这两个符合要求的数字,较小的数字越小,较大的数字越大,那么其乘积越小。所以,按照上述思路遍历的时候,最先找到的那一对数字就是要求的数字。
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
if(array.size() <= 0)
return vector<int> ();
int p1 = 0, p2 = array.size() - 1;
vector<int> num;
while(p1 < p2)
{
if(array[p1] + array[p2] == sum)
{
num.push_back(array[p1]);
num.push_back(array[p2]);
break;
}
else if(array[p1] + array[p2] < sum)
++ p1;
else
-- p2;
}
return num;
}
};