题目描述:
Give an array of integers,return indices of two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution.
Example:
Given nums=[2,7,11,15],target=9;
Because nums[0]+nums[1]=2+7=9;
return [0,1].
即给定一个整型数组和整数target,返回两个元素的下标,使他们满足相加的和等于target。你可以假定每个输入,都会恰好有一个满足条件的返回结果。
分析:这道题我们首先想到的是暴力求解法,复杂度为O(n2)。
第二个方法是hash,存储每个数对应的下标,复杂度为O(n)。
第三个方法是先排序在夹逼,但是这道题要返回的是下标,因此这个方法行不通。
以下是实现过程:
方法一:暴力求解法
class solution
{
public:
vector<int> TwoSum(vector<int> &num, int target)
{
vector<int> result;
for (int i = 0; i < num.size() - 1; ++i)
{
for (int j = i + 1; j < num.size(); ++j)
{
if (num[i] + num[j] == target)
{
result.push_back(i + 1);
result.push_back(j + 1);
}
}
}
return result;
}
};
这种方法虽然很容易想到,且代码很好写,但是缺点就是时间复杂度太高。所以我们看一下另一种用hash,时间复杂度为O(n)
方法二:
class solution
{
public:
vector<int> TwoSum(vector<int> &num, int target)
{
vector<int> result;
map<int, int> Map;
for (int i = 0; i < num.size(); ++i) //存储每个数对应的下标
{
Map[num[i]] = i;
}
for (int i = 0; i < num.size(); ++i)
{
int gap = target - num[i];
if (Map.find(gap) != Map.end())
{
result.push_back(i + 1);
result.push_back(Map[gap]+ 1);
break;
}
}
return result;
}
};
为了降低时间复杂度,我们应该想到将逐个比较转化为直接查找,查找target与当前元素的差。而查找最快的方法是利用一个map容器存储每个元素的索引。这样取得元素索引只要常数时间即可完成。最多只需遍历一次序列,将元素及其索引加入map中,在便利的过程中进行对应差值的寻找,如果找到了就结束遍历。这样就大大减小了时间复杂度