两数之和---简单

题目:

  给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

  给定 nums = [2, 7, 11, 15], target = 9

  因为 nums[0] + nums[1] = 2 + 7 = 9

  所以返回[0,1]

思路:

  很简单的想法就是遍历两次的O(n^2)的算法,暂时想不出,想看看吧。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int length=nums.size();
        for(int i=0;i<length;i++)
            for(int j=i+1;j<length;j++)
            {
                if((nums[i]+nums[j])==target)
                {
                    return vector<int>{{i,j}};
                }
            }
        return vector<int>{{-1,-1}};
    }
};

  结果果然不太好,看看大佬的:

× 关闭
执行用时为 4 ms 的范例
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::vector<int> vec;
        vec.reserve(2);
        std::unordered_map <int, int> map;
        map.reserve(nums.size());
        
        int count = 0;
        for( int i : nums )
        {
            auto&& is = map.find( target - i );
            if ( is != map.end() )
            {
                vec.push_back(count);
                vec.push_back( (*is).second );
                return vec;
            }
            else
            {
                map[i] = count;    
                count++;
            }
        }
        return std::move(vec);
    }
};

  大佬果然是大佬,简要解释一下:用一个无序map来检索,key是数字,保证了唯一性,不复用,value是下标,方便在找到时push_back回去。666

猜你喜欢

转载自www.cnblogs.com/manch1n/p/10315465.html