LeetCode“數組類型”第1題——Two Sum

一、題目

中文:

二、代碼

1、暴力法

暴力法很簡單。遍歷每個元素。

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

性能:

複雜度分析:

時間複雜度:O(n^2), 對於每個元素,我們試圖通過遍歷數組的其餘部分來尋找它所對應的目標元素,這將耗費 O(n)的時間。因此時間複雜度爲 O(n^2)。

空間複雜度:O(1)。 

2、哈希表

用一個哈希表存儲每個數對應的下標。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> mapping;
        vector<int> result;
        for(int i=0;i<nums.size();i++){
            mapping[nums[i]]=i;//用unordered_map先把數組中的數字和對應的下標存儲一遍,即數字作爲鍵,下標作爲值存儲。
        }        
        for(int i=0;i<nums.size();i++){
            const int gap=target-nums[i];//遍歷數組的時候用target-nums[i],得到差gap,然後在nordered_map中找是否存在gap,找到即返回gap所在的值,即所對應的數組的下標。
            if(mapping.find(gap)!=mapping.end()&&mapping[gap]>i){
                result.push_back(i);
                result.push_back(mapping[gap]);
                break;
            }
        }
        return result;
    }
};

性能:

複雜度分析:

時間複雜度:O(n)。

空間複雜度:O(n)。  

三、知識點解析

1、map、hash_map、unordered_map的區別

http://www.cnblogs.com/ranjiewen/p/5328137.html

https://blog.csdn.net/zhc_24/article/details/78915968

2、mapping.find(gap)!=mapping.end()的解析

https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html

用find函數來定位數據出現位置,它返回的一個迭代器,當數據出現時,它返回數據所在位置的迭代器,如果map中沒有要查找的數據,它返回的迭代器等於end函數返回的迭代器。

查找map中是否包含某個關鍵字條目用find()方法,傳入的參數是要查找的key,在這裏需要提到的是begin()和end()兩個成員,

分別代表map對象中第一個條目和最後一個條目,這兩個數據的類型是iterator.

 

 

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