两数之和

暴力解(循环):将目标值减去当前数组值得到一个结果,遍历数组找到结果值对应位置。

class Solution {

public:

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

         int n=nums.size();//nums的元素个数

         int i,j;

        for(i=0;i<n;i++)

        {

            for(j=i+1;j<n;j++)/*已经加过的元素不用再次相加,即计算过nums[0]+nums[1],不用再计算nums[1]+nums[0]*/

            {

                int r=target-nums[i];//r作为目标值减去当前遍历的元素

                if(nums[j]==r)//r元素存在下标

                {

                    int r1=i;

                    int r2=j;

                    return {r1,r2};

                }

            }

        }

        return {};

    }

};

优化解(map):将目标值减去当前数组值得到一个结果,那么该结果数值加上当前数组值就是目标值,通过map记录数组数值与数组下标从而可以直接查找数值和对应下标。

class Solution {

public:

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

        map<int,int>mp;//定义map数据结构

        int n=nums.size();//nums的元素个数

        int i;

        for(i=0;i<n;i++)

        {

            int c=nums[i];//c定义为值

            mp[c]=i;//值作为索引建、i作为值

        }

        for(i=0;i<n;i++)

        {

            int r=target-nums[i];//r作为目标值减去当前遍历到的元素

            if(mp.find(r)!=mp.end()&&mp[r]!=i)//查找是否有r存在当前元素中,且不能是相同数组下标

            {

                //若存在r,则找到对应下标

                int r1=i;

                int r2=mp[r];

                return {r1,r2};

            }

        }

         return {};

    }

};

更多推荐