和为S的两个数字:最直观的想法是,两层for循环,分别表示两个数,如果两个数之和等于S,则将其加入结果数组res,退出循环并返回。(超时)
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> res;
bool flag=false;
for(int i=0;i<array.size();i++)
{
for(int j=i+1;j<array.size();j++)
{
if(array[i]+array[j]==sum)
{
res.push_back(array[i]);
res.push_back(array[j]);
flag=true;
break;
}
}
if(flag)
break;
}
return res;
}
优化:使用一个uset来存储已经遍历过的数字,然后从头到尾遍历数组,如果能在uset中找到与当前元素互补S的另外一个数,则将这两个数加入结果数组中并返回,反之将当前元素加入uset中。这样就可以用空间换时间,将两层for循环降为一层for循环。
vector<int> FindNumbersWithSum(vector<int> array,int sum)
{
vector<int> res;
unordered_set<int> uset;
for(int i=0;i<array.size();i++)
{
if(uset.find(sum-array[i])!=uset.end())
{
res.push_back(array[i]);
res.push_back(sum-array[i]);
break;
}
else
uset.emplace(array[i]);
}
return res;
}



京公网安备 11010502036488号