原题
给出一个整数数组,请在数组中找出两个加起来等于目标值的数,你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的假设给出的数组中只存在唯一解
例如:
给出的数组为 {2, 7, 11, 15},目标值为9
输出 index1=1, index2=2
思路
总的思路是先把数组排序, 然后在首尾各放一个指针i, j遍历数组:
if i + j == target:
return [i, j];
else if i + j < target: # 和小于目标值, 把前面的指针往后移
++i;
else # 和大于目标值, 把后面的指针往前移
--j;
由于这道题求的是下标, 所以不能直接对原数组排序. 要再弄一个数组用来记录下标, 对这个记录下标的数组排序. 需要重定义一下排序时的比较函数, 根据原数组的值来确定两个下标的大小关系.
代码
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> index;
index.resize(numbers.size());
for (size_t i = 0; i < index.size(); ++i)
index[i] = i;
auto less = [&](int a, int b) -> bool {
return numbers[a] < numbers[b];
};
std::sort(index.begin(), index.end(), less);
int iFirst = 0;
int iLast = index.size() - 1;
while (iFirst < iLast) {
int sum = numbers[index[iFirst]] + numbers[index[iLast]];
if (sum == target)
break;
else if (sum > target)
--iLast;
else
++iFirst;
}
vector<int> res;
res.push_back(index[iFirst] + 1);
res.push_back(index[iLast] + 1);
if (res[0] > res[1])
std::swap(res[0], res[1]);
return res;
}
浙公网安备 33010602011771号