LeetCode on the way, two sum

完整代碼如下

  • 使用Hash表(時間複雜度爲O(1),但是需要建立Hash表,以空間換時間!)

有兩種使用Hash表的方法,第一種爲:

#include <iostream>
#include <unordered_map>
#include <vector>

using namespace std;

class Solution
{
public:
    Solution(){};
    ~Solution(){};

    vector<int> twoSum(vector<int> &numbers, int target){
        unordered_map<int, int> hash;
        vector<int> result;
        for (int i=0; i<numbers.size(); i++){
            int numberTofind = target - numbers[i];
            if (hash.find(numberTofind)!=hash.end()){
                result.push_back(hash[numberTofind]);
                result.push_back(i);
                return result;
            }
        hash[numbers[i]]=i;
        }
      return result;
    }

};

第二種爲:

class Solution {  
public:  
    vector<int> twoSum(vector<int>& nums, int target) {  
        unordered_map<int, int> num_map;  
        vector<int> res;  
        for (int i = 0; i < nums.size(); i++) {  
            num_map[nums[i]] = i;  
        }  
        for (int i = 0; i < nums.size(); i++) {  
            int tmp = target - nums[i];  
            if (num_map.find(tmp) != num_map.end() && num_map[tmp] != i){  
                res.push_back(i);  
                res.push_back(num_map[tmp]);  
                break;  
            }  
        }  
        return res;  
    }  
};  

其實觀察上面兩種實現,有一個小細節是兩者的if判斷條件不同,第二種的if加了一個&& num_map[tmp] != i。原因是因爲第一種在初次遍歷的同時建立hash表(只要未掉入if語句塊),所以不存在num_map[tmp] != i的情形。而第二種方法就是很蠻力地做了兩次遍歷,初次遍歷只用於建立hash表,所以第二次遍歷的時候if就要考慮num_map[tmp]是否爲i了。總的來看,第一種更快更好!

下面是測試代碼:

int main(int argc, char const *argv[])
{
    Solution s;
    int a[4] = {2,7,11,15};
    vector<int> v(a,a+4);
    vector<int> w;
    w = s.twoSum(v,9);
    // for (int i=0; i < sizeof(a)/sizeof(int); i++)
    // {
    //     cout<<a[i]<<endl;
    // }
    cout<<"The indices of are:";
    for (int i=0; i<w.size(); i++)
    {
        cout<<w[i]<<" ";
    }
    return 0;
}

收穫主要是:
1. 學會了vector的一個遍歷方式,利用numbers.size();vector的一種用數組的初始化方法
2. 學習到unordered_map,unordered_map和map類似,都是存儲的key-value的值,可以通過key快速索引到value。不同的是unordered_map不會根據key的大小進行排序。

發佈了108 篇原創文章 · 獲贊 69 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章