lintcode 两数之和
描述
给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。
样例
给出 numbers = [2, 7, 11, 15], target = 9, 返回 [0, 1].
思路
首先,最容易想到的就是对于第i个 从j = i + 1开始往后遍历到结束,把i和j放到vector中,返回。实现方式比较简单,就不写了。
但是这种复杂度比较高。我想了一种使用两个指针的方法,但是写的时候发现也没那么容易。
首先是要进行排序,找到两个数之后还要再在原来的数组中寻找这两个数。这个方法的复杂度取决于排序,我们使用的是STL自带的sort排序,还是比较快的。
class Solution {
public:
/**
* @param numbers: An array of Integer
* @param target: target = numbers[index1] + numbers[index2]
* @return: [index1, index2] (index1 < index2)
*/
vector<int> twoSum(vector<int> &numbers, int target) {
// write your code here
vector<int> res,
temp = numbers;
sort(numbers.begin(), numbers.end());
int i = 0,
j = numbers.size() - 1;
while (i < j) {
if (numbers[i] + numbers[j] > target)
j--;
else if (numbers[i] + numbers[j] < target)
i++;
else if (numbers[i] + numbers[j] == target)
break;
}
for (int k = 0; k < temp.size(); k++) {
if (temp[k] == numbers[i])
res.push_back(k);
else if (temp[k] == numbers[j]) {
res.push_back(k);
}
if (res.size() == 2) {
if (res[0] > res[1])
swap(res[0],res[1]);
return res;
}
}
}
};