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::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;
    }
};

你可能感兴趣的:(算法,leetcode)