和为S的两个数字
题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
使用两个游标head和tail分别指向数组头部和尾部, 两个游标向彼此方向移动. 当两个游标和为sum时, 判断大小并插入ret中; 当两个游标和小于sum时, head向后移动; 当两个游标和大于sum时, tail向前移动
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> ret;
if (array.empty())
return ret;
int head = 0;
int tail = array.size() - 1;
while(head < tail) {
// 相等时
if (sum == (array[head] + array[tail])) {
if (ret.empty()) { // 判断ret是否空
ret.push_back(array[head]);
ret.push_back(array[tail]);
}
else {
if ((ret[0] * ret[1]) > (array[head] * array[tail])) {
ret[0] = array[head];
ret[1] = array[tail];
}
}
head++;
tail--;
continue;
}
if (sum > (array[head] + array[tail])) {
head++;
continue;
}
if (sum < (array[head] + array[tail])) {
tail--;
continue;
}
}
return ret;
}
};
暴力法, 牛客没通过, 应该超时了
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> ret;
for (int i = 0; i < array.size() - 1; i++) {
for (int j = i + 1; j < array.size(); j++) {
if (sum == (array[i]+array[j])) {
ret.push_back(array[i]);
ret.push_back(array[j]);
return ret;
}
}
}
return ret;
}
};