题目的意思就是在一个数组里面找到两个元素,它们的和与给定的期望值一样,返回值为两个元素的位置信息。
- 第一种本能想法O(n2)的算法:
<span style="font-size:14px;"> vector<int> twoSum(vector<int>& nums, int target) {
int i=0;
int j=0;
int len=nums.size();
vector<int> ret;
for(i=0;i<len;i++)
{
for(j=i+1;j<len;j++)
{
if((nums[i]+nums[j])==target)
{
ret.push_back(i);
ret.push_back(j);
return ret;
}
}
}
return ret;
}</span>
Runtime: 564 ms 这种算法时间复杂度较高,搜了下网上发现居然有O(N)的解法
- 第二种O(N)算法,利用哈希表辅助存储:
<span style="font-size:14px;"> vector<int> twoSum(vector<int>& nums, int target) {
int i=0;
int j=0;
int len=nums.size();
vector<int> ret;
map<int,int> listIndex;
map<int,int>::iterator it;
for(i=0;i<len;i++)
{
it = listIndex.find(target-nums[i]);
if(it == listIndex.end())
{
listIndex[nums[i]]=i;
}
else
{
ret.push_back(it->second);
ret.push_back(i);
return ret;
}
}
return ret;
}</span>
Runtime: 24 ms 从i=0到数组末尾依次进行遍历,当前位置为i,查找target-nums[i]是否在哈希表中,题目要求只需要找到一个解,因此能够满足要求。