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的下標
思路分析:
這是一道經典的在陣列中找和為定值的題目。通常這種題目有以下幾種解法:
- 將陣列進行雙層遍歷,直到找到第一層的數和第二層的數相加等於目標數
- 將遍歷過的數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 的正向迭代器的起始位置與終點位置;