21-07-27 求两数的和

1.暴力解法

枚举出所有结果

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
    //定义vector先不要规定容量
    //因为后面的push_back()是在规定的容量之后添加数据
        vector<int> ans;
        for(int i=0;i<nums.size();i++){
            for(int j=i+1;j<nums.size();j++){
                if(nums[i]+nums[j]==target){
                    ans.push_back(i);
                    ans.push_back(j);
                    return ans;
                }
            }
        }
        return ans;
    }
};

2.利用unordered_map降低时间复杂度

unordered_map内部实现哈希表,即一个key对应一个value。map.find(key),返回值类型是迭代器,查询哈希表中是否有该key对应的value,若有,则返回迭代器的位置,若无,则返回map.end() 。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ans;
        unordered_map<int,int> map;
        map[nums[0]]=0;
        for(int i=1;i<nums.size();i++){
            int another_num=target-nums[i];
            auto iter = map.find(another_num);
            //等价于
            //unordered_map<int,int>::iterator iter = map.find(another_num);
            if(iter == map.end()){
                map[nums[i]]=i;
            }else{
                ans.push_back(map[another_num]);
                ans.push_back(i);
                return ans;
            }
        }
        return ans;
    }
};

3.补充

如果数组为有序数组,可以利用左右指针来解

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) { 
        vector<int> ans;
        //此题假设容器为升序
        int left,right;
        left = 0;
        right = nums.size()-1;
        while(left<right){
            int sum = nums[left] + nums[right];
            if(sum==target){
                ans.push_back(left);
                ans.push_back(right);
                return ans;
            }else if(sum>target) right--;
            else if(sum<target) left++;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值