题目描述:

1、对于这个题目,第一个想到的就是暴力法,两遍for循环解决(暴力法的弱点就是空间复杂度及其的高。。O(n2))
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> s;
for(int n = 0; n < nums.size(); ++n)
{
for(int j = n + 1; j <nums.size(); ++j)
{
if((nums[n] + nums[j]) == target)
{
s.push_back(n);
s.push_back(j);
break;
}
}
if(s.size() > 0)
{
break;
}
}
return s;
}
2、使用map(map用来做查找,效率非常稳定,底层是红黑二叉树)
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> s;
std::map<int, int> map;
for (int n = 0; n < nums.size(); ++n)
{
int distance = target - nums.at(n);
std::map<int, int>::const_iterator iter = map.find(distance);
if (iter != map.end())
{
s.push_back(iter->second);
s.push_back(n);
break;
}
map[nums[n]] = n;
}
return s;
}
提交效率也是非常不错的

3、拓展:map底层是一个红黑二叉会默认排序,导致效率有时候不稳定,这时候我们转而使用unordered_map,会让效率极大程度稳定
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> s;
std::unordered_map<int, int> map;
for (int n = 0; n < nums.size(); ++n)
{
int distance = target - nums.at(n);
std::unordered_map<int, int>::const_iterator iter = map.find(distance);
if (iter != map.end())
{
s.push_back(iter->second);
s.push_back(n);
break;
}
map[nums[n]] = n;
}
return s;
}

红色部分是使用map提交的结果,绿色部分是使用unorder_map提交的

被折叠的 条评论
为什么被折叠?



