题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述
对应每个测试案例,输出两个数,小的先输出。
第一想法
- 从中间开始,双指针。取第一组和为S的数
- 从头开始,双指针,取phigh - plow最小组的数
思路
(刚开始因为乘积最小陷入平方根的泥沼中.其实只需要取中间的数双指针做就可以了)
AC代码
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int len = array.size();
int plow = len / 2, phigh = plow + 1;
int low,high;
vector<int> vec;
while(plow >= 0 && phigh < array.size())
{
if(array[plow] + array[phigh] > sum)
plow--;
else if(array[plow] + array[phigh] < sum)
phigh++;
else{
low = array[plow];
high = array[phigh];
phigh++;
}
}
if(low + high != sum)
return vec;
vec.push_back(low);
vec.push_back(high);
return vec;
}
};
看了讨论区
发现我的是从乘积最大的就开始找,明明直接两端开始找就可以了
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int len = array.size();
int plow = 0, phigh = len - 1;
vector<int> vec;
while(plow < phigh)
{
if(array[plow] + array[phigh] == sum){
vec.push_back(array[plow]);
vec.push_back(array[phigh]);
return vec;
}
while(array[plow] + array[phigh] < sum && plow < phigh) plow++;
while(array[plow] + array[phigh] > sum && plow < phigh) phigh--;
}
return vec;
}
};
网友评论