1. Two Sum[E]兩數之和

題目


Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] +nums [1] = 2 + 7 = 9,
return [0, 1]python

思路


思路1:雙重循環

這種是最容易想到的思路,比較暴躁,複雜度\(O(N^2)\)數組

思路2:哈希表

題目對數a、b求和,可是返回的是等於target時a、b的下標,因而想到將數組下標與對應值做一個映射表。C++使用unordered_map關聯容器能夠實現鍵值與真值的映射。python中使用字典來實現相似功能。app

Tips


unordered_map

1. 原型
template <class T,             //鍵值類型
          class T,                       // 映射類型
          class hash = hash<key>,      //哈希函數對象類型
          class Pred = equal_to <key>,       //相等比較函數對象類型
          class Alloc = allocator < pair<cosnt key, T> >   //alloctor類
          >
2. 特性
  • 關聯性:經過key值檢索value,而不是經過絕對地址(和順序容器不一樣)
  • 無序性:使用hash表存儲,內部無序
  • Map:每一個值對應一個key值
  • key惟一性:不存在兩個元素的key同樣
  • 動態內存管理:使用動態內存管理模型來動態管理所須要的內存空間。
3. 經常使用函數
  • count
    原型
    size_type count (const key_type& k) const;
    說明
    使用給定的Key值計算元素。搜素容器中Key值做爲輸入參數k的元素,並返回元素的數量。因爲unorder_map容器不容許存在重複的Key值,這說明若是容器中存在具備該Key值的元素,則該函數返回1,不然返回0。
4. 小結

unordered_map的數據以pair<const Key, T>保存,first是鍵值(key value),second是映射值(the mapped value)。賦值語句m[key value] = the mapped value函數

C++


  • 思路1
vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> results;
        
        for(int i=0;i<nums.size();i++)
        {
            for(int j=i+1;j<nums.size();j++)
            {
                if(nums[i]+nums[j]==target)
                {
                    results.push_back(i);
                    results.push_back(j);
                    
                    return results;
                }
                else
                {
                    continue;
                }
            }
        }
    }
  • 思路2
vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> m;
        vector<int> results;
        
        //數組中的值做爲map的鍵值,其下標做爲對應的映射值
        for(int i=0;i<nums.size();i++)  
        {
            m[nums[i]] =i;
        }
        
        for(int i = 0;i<nums.size();i++)
        {
            int t = target - nums[i];
            if(m.count(t) && m[t] != i) // 不能使用一樣的數兩次
            {
                results.push_back(i);
                results.push_back(m[t]);
                break;
            }
        }
        return results;
    }

Python


  • 思路2
def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
         #創建字典
        table ={nums[i] : i for i in range(len(nums))}
        
        results = []
        for i in range(len(nums)):
            t = target - nums[i]
            if table.get(t) is not None and (table.get(t) != i):
                results = [i, table.get(t)]
                break;
                
        return results
相關文章
相關標籤/搜索