深度解析兩數之和

題目來源: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%左右。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章