题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
思路: 设置左右两个指针,左指针指向数组第一个,右指针指向数组最后一个,当指向指向的数相加大于S时,则右指针左移;当指向指向的数相加小于S时,则左指针右移;当指向指向的数相加等于S时,最先获得两个数乘积最小,无须遍历后面的数,停止循环。
C++
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int size = array.size();
vector<int>res;
if (sum <= 0 || size == 0 || sum <= array[0])
return res;
//设置左右两个指针
int left = 0;
int right = size - 1;
while (left <= right)
{
//两端的两数相加,若小于sum,则左指针右移
if (array[left] + array[right] < sum)
left++;
//若大于sum,则右指针左移
else if (array[left] + array[right] > sum)
right--;
//相等则最先获得的两个数乘积最小
else
{
res.push_back(array[left]);
res.push_back(array[right]);
break;
}
}
return res;
}
};