方法一,暴力搜索,时间O(n^2)。
方法二,使用hash (可用STL中的unordered_map)来保存每个int对应的index,时间O(n),空间O(n)。代码如下:
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> result;
unordered_map<int, int> hash;
for(int i=0; i<numbers.size(); ++i)
hash[numbers[i]] = i;
for(int i=0; i<numbers.size(); ++i)
{
int remain = target - numbers[i];
if(hash.find(remain) != hash.end() && hash[remain] != i)
{
result.push_back(i+1);
result.push_back(hash[remain]+1);
break;
}
}
return result;
}
};
方法三: 先排序,然后左右夹逼。排序O(nlogn),夹逼O(n),最终O(nlogn)。但在本题中,需要返回index而非value值,所以可以使用另外的index数组,进行key-value排序,空间复杂度O(n)。
参考: Leetcode题解。