题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路:
设置两个头尾指针i,j,计算出头尾两个数的和tmp。
(1)如果tmp == sum,那么要找的就是这两个数;
(2)如果tmp < sum,那么说明tmp还小,需要大数,头指针右移;
(3)如果tmp > sum,那么说明tmp比较大,需要小数,尾指针左移;
这里最终答案可能不止一个,所以需要记录符合条件的积,选择一个最小的积。所以对于情况(1),头尾指针都要往中间移,寻找其他的答案。
代码如下:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int i = 0, j = array.size()-1;
vector<int> ret;
int min = INT_MAX;
while (i < j) {
int tmp = array[i] + array[j];
int tmp_mutil = array[i] * array[j];
if (sum == tmp) {
if (tmp_mutil < min) {
ret.resize(2);
ret[0] = array[i];
ret[1] = array[j];
min = tmp_mutil;
}
++i;
--j;
} else if (sum < tmp) {
--j;
} else {
++i;
}
}
return ret;
}