您的位置:首页 > 其它

[LeetCode] Two Sum

2016-07-29 00:00 477 查看
https://leetcode.com/problems/two-sum/

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

这题最先想到的肯定是暴力解法,时间复杂度为o(n2),代码如下:

class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
for (int i = 0; i < numbers.size() - 1; ++i)
{
for (int j = i + 1; j < numbers.size(); ++j)
{
if (numbers[i] + numbers[j] == target)
{
return vector<int>{i + 1, j + 1};
}
}
}

}
};

直接用暴力解法,在 leetcode 上提交会超时(试了下lintcode,暴力解法可以过掉所有测试用例),那有没有更快的方法呢?我最先想到的是利用哈希表,来记录数组元素值与其下标的映射关系,这样只需要对数组遍历一遍即可,时间复杂度为o(n),空间复杂度也是o(n)。在遍历的同时,完成哈希表的查询与插入。代码如下:

class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
unordered_map<int, int> hash;
for (int i = 0; i != numbers.size(); ++i)
{
unordered_map<int, int>::const_iterator itr = hash.find(target - numbers[i]);
if (itr == hash.cend())
{
hash.insert(make_pair(numbers[i], i));
}
else
{
return vector<int>{itr->second + 1, i + 1};
}
}

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: