1. 程式人生 > >LeetCode刷題筆記-001:two-sum

LeetCode刷題筆記-001:two-sum

給定一個數組nums,一個目標值target,在陣列找兩個數滿足這兩個數的和為target。

返回這兩個數在nums中的下標。

example:

nums = [2,7,11,15]

target = 9

return [0,1]

題意分析:

在陣列中尋找兩個數a,b,使得a+b = target,返回a,b的下標

思路分析:

這是一道經典的在陣列中找和為定值的題目。通常這種題目有以下幾種解法:

  1. 將陣列進行雙層遍歷,直到找到第一層的數和第二層的數相加等於目標數
  2. 將遍歷過的數a全部記錄下來,然後對正在遍歷的數b進行判斷,判斷target - b是否已經遍歷過。(time: O(n), space: O(n))

對於思路一:

'''

class Solution {

public:

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

        //unordered_map<int,int> hash;//用於儲存訪問過的值和索引

        vector<int> ans;

        int i,j;

        for(i=0;i<nums.size();i++){

            for(j=i+1;j<nums.size();j++){

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

                    ans.push_back(i);

                    ans.push_back(j);

                    return ans;

                }

            }

        }

        return ans;

    }

};

15:24:07

CA 2018/10/10 15:24:07

 

class Solution {

public:

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

        vector<int> ans;

        int i;

        for(i=0;i<nums.size();i++){

            int dest_num=target-nums[i];

            if(hash.find(dest_num)!=hash.end()){

                ans.push_back(hash.find(dest_num));

                ans.push_back(i);

                return ans;

            }

            hash[nums[i]]=i;

        }

        return ans;

    }

};

'''

結果:

 

 

 

對於思路二:

'''

class Solution {

public:

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

        //unordered_map<int,int> hash;//用於儲存訪問過的值和索引

        vector<int> ans;

        int i;

        for(i=0;i<nums.size();i++){

            int dest_num=target-nums[i];

            if(hash.find(dest_num)!=hash.end()){

                ans.push_back(hash.find(dest_num));

                ans.push_back(i);

                return ans;

            }

            hash[nums[i]]=i;

        }

        return ans;

    }

};

'''

結果:

 

 

 

關於unordered_map解釋:

unordered_map 是一種關聯容器,用於儲存由關鍵值 (Key Value,以下稱為Key 值) 和對映值 (Mapped Value,以下稱為對映值) 組成的元素,並且允許根據其 Key 值快速檢索各個元素。

在 unordered_map 容器中,Key 值通常用來唯一標識元素,對映值是與該 Key 值關聯內容的物件。Key 值與對映值的型別可能不同。

在 unordered_map 內部,元素沒有按照其 Key 值與對映值的任何順序進行排序 ,而是根據它們的 Hash 值組織成桶,允許它們通過其 Key 值直接快速訪問單個元素(通常具有常數等級的平均時間複雜度)。

unordered_map 容器與 map 容器相比,通過 Key 值訪問各個元素的速度更快,然而通過其元素子集進行範圍迭代的效率通常較低。

unordered_map 實現了直接訪問操作符 (operator[]),它允許使用 Key 值作為輸入引數,直接訪問對映值。

部分操作函式基本和 map 相同:

  • clear
    • 清除 map 中所有元素;
  • erase
    • 刪除 map 中指定位置的元素;
  • insert
    • 在 map 指定位置新增 pair 型別的元素;
  • find
    • 獲取 map 中元素的迭代器;
  • begin, end
    • map 的正向迭代器的起始位置與終點位置;