1. 程式人生 > >LeetCode第一題:兩數之和C++實現

LeetCode第一題:兩數之和C++實現

//方法一:暴力法
//遍歷每個元素 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;
}