1. 程式人生 > >two Sum leetCode第一題

two Sum leetCode第一題

題目描述:

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
題目tags為:Array   Hash Table

思路:

最原始的方法就是使用組合的思想,使用一個巢狀迴圈,讓一個元素與其之後的每個元素都加一次,判斷是否與target相等

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

	int vSize = nums.size();
	int index = 0;
	int num, tmp;
	vector<int> vResult;

	int i, j;
	for (i=0; i<vSize; ++i)
	{
		for (j=i+1; j<vSize; ++j)
		{
			if (nums[i] + nums[j] == target)
			{
				vResult.push_back(i + 1);
				vResult.push_back(j + 1);
//				cout << "index1=" << i << ", index2=" << j <<endl;
			}
		}
	}
	return vResult;
}
該方法的時間複雜度是O(n^2),提交上去是會超時的

使用map,在nums這個vector中查詢的同時,將其插入到map中,向map中插入時是將nums[i]作為key,將下標i作為value,程式碼為:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int vSize = nums.size();
    	int index = 0;
    	int num, tmp;
    	vector<int> vResult;
    	
    	map<int,int> tmpMap;
    	
    	for (index = 0; index < vSize; ++index)
    	{
    		tmp = nums[index];
    
    		num = tmpMap.count(target - tmp);
    		if (0 != num)
    		{
    			map<int,int>::iterator mapIter = tmpMap.find(target - tmp);
    			vResult.push_back(mapIter->second + 1);
    			vResult.push_back(index+1);
    		}
    		
    		num = tmpMap.count(tmp);
    		if (0 == num)
    		{
    			tmpMap.insert(pair<int,int>(nums[index],index));
    		}
    		
    		
    	}
    	return vResult;    
    }
};
首先判斷target - nums[index]是否在tmpMap中,如果該值為tmpMap中,則index和target - nums[index]所對應的下標就是所需要的結果;否則,則將nums[index]存入到tmpMap中。關於這樣寫的原因如下:
  1. 為啥要使用map:因為在map中查詢某個值的複雜度比較小,為logN
  2. 為啥要先判斷target - nums[index]是否在tmpMap中:在提交時遇到這麼一組資料:3,2,4;target為6。如果要按照先判斷nums[index]是否在tmpMap中,不在tmpMap中則將nums[index]和index插入到map中,然後再判斷target - nums[index]是否在tmpMap中。這樣的話,tepMap為空,3不在map中,然後插入3,再判斷6-3=3是否在map中,由於剛剛插入了一個3,所以現在6-3=3就在map中了,這樣就會導致一個錯誤的結果
  3. 為啥mapIter->second就比index要大:由於target為nums中的兩個下標不同的元素的和(這兩個下標在本文中先記為i1和i2),並且迴圈是從0~vSize,當遍歷到nums[i1]時,此時target - nums[i1] (其值與nums[i2]相同)還未被插入到map中,因此會執行insert操作,將nums[i1]插入到map中,當再遍歷到nums[i2]時,此時target - nums[i2] (其值與nums[i1]相同,並且nums[i1]已存在於map中)會被找到,所以也就操作完成了
另外一個思路是邊查詢邊建立AVL樹,下一步就去實現……