题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
PS:抛物线开口向下,找到的第一组(相差最大的)就是乘积最小的,不需要比较
思路一、哈希
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum)
{
vector<int> v;
map<int,int>mp;
for(int i=0;i<array.size();i++)
{
mp[array[i]]++;
}
int result1,result2;
int pro;
int minp = 1000000;
for(int i=0;i<array.size()&&array[i]<=sum/2;i++)
{
if(mp[sum-array[i]])
pro = array[i]*(sum-array[i]);
if(pro<minp)
{
minp = pro;
result1 = array[i];
result2 = sum-array[i];
}
}
if(result1+result2==sum)
{
v.push_back(result1);
v.push_back(result2);
}
return v;
}
};
思路二、两头往中间扫
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum)
{
vector<int> v;
int l = 0;
int r = array.size()-1;
while(l<r)
{
if(array[l]+array[r]==sum)
{
v.push_back(array[l]);
v.push_back(array[r]);
break;
}
else if(array[l]+array[r]>sum)
r--;
else
l++;
}
return v;
}
};