LeetCode第一題:兩數之和C++實現
阿新 • • 發佈:2018-12-12
//方法一:暴力法 //遍歷每個元素 xx,並查詢是否存在一個值與 target−x 相等的目標元素。 vector<int> twoSum(vector<int>& nums, int target) { vector<int> ans; int length = nums.size(); for (int i = 0; i < length; i++){ for (int j = i+1; j < length; j++){ if(nums[i] + nums[j] == target){ ans.push_back(i); ans.push_back(j); } } } return ans; } /* 複雜度分析: 時間複雜度:O(n^2), 對於每個元素,我們試圖通過遍歷陣列的其餘部分來尋找它所對應的目標元素, 這將耗費 O(n) 的時間。因此時間複雜度為 O(n^2)。 空間複雜度:O(1)。 */ //方法二 C++版本的兩遍雜湊表(官方題解) /* 通過以空間換取速度的方式,我們可以將查詢時間從 O(n) 降低到 O(1)。 C++版本的雜湊表演算法採用unordered_map。 */ vector<int> twoSum(vector<int>& nums, int target) { vector<int> ans; unordered_map<int,int> tmpmap; int length = nums.size(); for(int i = 0;i < length;i++){ tmpmap[nums[i]] = i; } for (int i = 0; i < length; i++){ if(tmpmap.count(target - nums[i]) != 0 && tmpmap[target - nums[i]] != i){ ans.push_back(i); ans.push_back(tmpmap[target - nums[i]]); break; } } return ans; } //方法三 C++版本的一遍雜湊表(官方題解) /* 事實證明,我們可以一次完成。在進行迭代並將元素插入到表中的同時,我們還會回過頭來檢查 表中是否已經存在當前元素所對應的目標元素。如果它存在,那我們已經找到了對應解,並立即將其返回。 */ vector<int> twoSum(vector<int>& nums, int target) { vector<int> ans; unordered_map<int,int> tmpmap; int length = nums.size(); for (int i = 0; i < length; i++){ if(tmpmap.count(nums[i]) != 0){ ans.push_back(tmpmap[nums[i]]); ans.push_back(i); break; } tmpmap[target - nums[i]] = i; } return ans; }