和为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; }