深度解析两数之和

题目来源:https://leetcode-cn.com/problems/two-sum

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

解法1:

暴力匹配,列出所有的pairs,符合条件输出即可

class Solution {

public:

    vector<int> twoSum(vector<int>& nums, int target) {

        vector<int> vecres;

        vecres.resize(2);

        int s=nums.size();

        for(int i=0;i<s;i++)

        {

            for(int j=i+1;j<s;j++)

            {

                if((nums[i]+nums[j])==target)

                {

                    vecres[0]=i;

                    vecres[1]=j;

                    return vecres;

                }

            }

        

        return vecres;

    }

};

解法2:

解法1耗时太多,使用hash_map记录,提高效率。

#include <unordered_map>

class Solution {

public:

    vector<int> twoSum(vector<int>& nums, int target) {

        vector<int> vecres;

        vecres.resize(2);

        std::unordered_map<int,int> mapint;

        int s=nums.size();

        for(int i=0;i<s;++i)

        {

            mapint[nums[i]]=i;

        }

        for(int i=0;i<s;i++)

        {

            int num2=target-nums[i];

            if(mapint.find(num2)!=mapint.end())

            {

                if(i!=mapint[num2])//这里防止元素使用2遍

                {

                   vecres[0]=i;

                    vecres[1]=mapint[num2];

                

                    return vecres;

                }

            }

        }

    return vecres;

    }

};

3、官方解法

#include <unordered_map>

class Solution {

public:

    vector<int> twoSum(vector<int>& nums, int target) {

        vector<int> vecres;

        vecres.resize(2);

        std::unordered_map<int,int> mapint;

        int s=nums.size();

      //  for(int i=0;i<s;++i)

        {

            mapint[nums[i]]=i;

       // }

        for(int i=0;i<s;i++)

        {

            int num2=target-nums[i];

            if(mapint.find(num2)!=mapint.end())

            {

             

                    vecres[0]=i;

                    vecres[1]=mapint[num2];

                    return vecres;

                

            }

            mapint[nums[i]]=i;

        }

    return vecres;

    }

};

从官方解法可以看出它只是遍历了一遍,而且避免了同一元素使用2次,因为使用当前元素时,当前元素并不在map里面。但是内存是打败了100%用户,效率只打败96%左右。

猜你喜欢

转载自blog.csdn.net/kupe87826/article/details/105736020