题目描述:
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
本题知识点:
数学
解题思路:
- 常规方法,先找出数组中第一个大于S的数R,然后从头开始在当前数L到数R之间寻找与当前数的和为S的数,如果找到返回,没找到,就将当前数L向右移一位。因为两个数离得越远,乘积就越小,所以只需找到第一个满足条件的数即可。
- 设置两个指针,一个在数组最左边L,一个在最右边R,计算两个数之和,如果大于S,则将R左移;如果小于S,将L右移,直到L和R处于相邻位置。
代码:
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> result;
if(array.size() < 2)
return result;
if(sum < array[0] + array[1])
return result;
auto place = find_if(array.begin(), array.end(), [sum](int a){return a > sum;});
for(int i = 0; i < array.size(); i++)
{
int product = 0;
if(sum > array[i])
{
auto temp = find(array.begin() + i, place, sum - array[i]);
if(temp != place)
{
result.push_back(array[i]);
result.push_back(*temp);
return result;
}
}
else
return result;
}
}
};