算法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

posted on 2025-04-21 19:48  sakura430  阅读(5)  评论(0)    收藏  举报