目录
题目
描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回两个数的乘积最小的,如果无法找出这样的数字,返回一个空数组即可。
返回值描述:
对应每个测试案例,输出两个数,小的先输出。
解题考虑
找到多组结果,要不要写一组判断,判断哪一组乘积最小
代码
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int len = array.size();
vector<vector<int> > answer;
//双指针找两数之和为sum
for(int i = 0; i<len-1; i++)
{
int temp = sum - array[i];
for(int j = i+1; j<len; j++)
{
if(array[j]==temp)
{
//return {array[i], array[j]};
vector<int> temp1{array[i], array[j]};
answer.push_back(temp1);
}
}
}
int len2 = answer.size();
vector<int> multp;
//保存两数的乘积
for(int i = 0; i<len2; i++)
{
int temp2 = 1;
for(auto &j: answer[i])
temp2 *= j;
multp.push_back(temp2);
}
//生成记录乘积的下标的数组
vector<int> answer_p(len2, 0);
int j = 0;
for(auto &i: answer_p)
{
i = i+j;
j++;
}
//冒泡比较乘积的大小,获得最小乘积的下标
for(int i = 0; i<len2-1; i++)
{
for(int j = i+1; j<len2; j++)
{
if(multp[i]>multp[j])
{
int temp3 = multp[j];
multp[j] = multp[i];
multp[i] = temp3;
int temp4 = answer_p[j];
answer_p[j] = answer_p[i];
answer_p[i] = temp4;
}
}
return answer[answer_p[0]];
}
//无法找到,返回一个空数组
return {};
}
};
数学推断
数组递增排序,其实双指针判断到第一个和为S的就直接返回就行了,不必判断存在多组结果时,找到乘积最小的是哪一组,因为一定是第一组
最终答案
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int len = array.size();
vector<vector<int> > answer;
//双指针找两数之和为sum
for(int i = 0; i<len-1; i++)
{
int temp = sum - array[i];
for(int j = i+1; j<len; j++)
{
if(array[j]==temp)
{
return {array[i], array[j]};
}
}
}
//无法找到,返回一个空数组
return {};
}
};