算法day16 两数之和
题目描述

思路一:暴力for循环
我们可以通过两层for循环嵌套,遍历所有的元素,使其求和判断是否与target相等来操作。
代码如下
vector<int> twoSum(vector<int>& nums, int target) {
int len = nums.size();
vector<int> index;
for(int i=0;i<len-1;i++){
for(int j=i+1;j<len;j++){
if( (nums[i] + nums[j]) == target ){
cout<<i<<","<<j<<endl;
index.push_back(i);
index.push_back(j);}
}
}
return index;
}
时间复杂度:O(n^2)
空间复杂度:O(n^2)
//扩展:关于vector长度声明的区分
在本题中我们的第一个解法并没有初始化vector的长度,程序顺利执行,而在之前的题目中我们都会对vector进行长度的声明,这里做一个场景的总结区分:

思路二:哈希
我们可以采取unordered_map来完成我们的目标,我们采取循环遍历nums的每一个元素,利用target-nums[i]得到它的补数,如果我们在hash表中找到了对应的补数,我们就返回它与当前的nums元素的index,又由于题干说明可以假设只有一组答案,所以我们直接返回添加了这组index的vector数组即可。
代码如下
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> hash;
vector<int> res;
int size = nums.size();
int s;
for(int i=0;i<size;i++){
s = target - nums[i];
auto iter = hash.find(s);
if(iter!=hash.end()){
res.push_back(iter->second);
res.push_back(i);
return res;
}
hash.insert({nums[i],i});
}
return res;
}
时间复杂度:O(n)
空间复杂度:O(n)
END
浙公网安备 33010602011771号