最初版本:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> re;
for(vector<int>::iterator iter = nums.begin();iter!=nums.end();++iter)
{
vector<int>::iterator it = iter;
for(++it;it!=nums.end();++it)
{
if(*iter+*it==target)
{
re.push_back(iter-nums.begin());
re.push_back(it-nums.begin());
return re;
}
}
}
return re;
}
};190ms 才战胜百分之17.。。
两个迭代器遍历 结果符合就求出到begin的距离输出。。O(n2) O(1)。
第二个版本:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> re;
map<int,int> value_index;
for(vector<int>::iterator it = nums.begin();it!=nums.end();it++)
{
map<int,int>::iterator iter=value_index.find(target-*it);
if(iter!=value_index.end())
{
re.push_back(iter->second);
re.push_back(it-nums.begin());
return re;
}
value_index.insert(make_pair(*it,it-nums.begin()));
}
}
};执行8ms。超过97.19%。。。通过map映射值和下标。先检验map中是否包含当前遍历到的值的答案,包含就返回,不包含就把当前值添加到map里。
本文探讨了两数之和问题的两种不同解决方案。第一种方法使用双重迭代遍历数组,时间复杂度为O(n²),空间复杂度为O(1)。第二种方法通过哈希表映射值和其索引,将时间复杂度降低到O(n),空间复杂度提升到O(n)。优化后的算法执行效率显著提高。

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



