算法訓練-LeeCode001兩數之和

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。c++

你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。數組

示例:學習

給定 nums = [2, 7, 11, 15], target = 9優化

由於 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1]ui

解法一 :暴力運算

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
    	vector<int> result;
		if (nums.size() < 2)
		{
			return result;	
		}

		for (int i=0; i<nums.size(); i++) 
		{
			bool find = false;
			for (int j = i+1; j < nums.size(); ++j)
			{
				if (nums[i]+nums[j] == target)
				{
					result.push_back(i);
					result.push_back(j);
					find = true;
					break;
				}
			}
			if (find)
			{
				break;
			}
		}

		return result;
	    }
};
複製代碼

解法二 :轉map

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
    	vector<int> result;
		if (nums.size() < 2)
		{
			return result;	
		}

		map<int, int> mapNums;
		for (int i = 0; i < nums.size(); ++i)
		{
			int num = nums[i];
			mapNums[num] = i;
		}

		// map<int,int>::iterator it = mapNums.begin();
		// while(it != mapNums.end())
		// {
		// cout << it->first << " " << it->second << endl;
		// it ++; 
		// }

		for (int i = 0; i < nums.size(); ++i)
		{
			int otherValue = target - nums[i];
			map<int, int>:: iterator it = mapNums.find(otherValue);
			if (it != mapNums.end() && it->second != i)
			{
				result.push_back(i);
				result.push_back(mapNums[otherValue]);
				break;
			}
		}

		return result;
	    }
};
複製代碼

解法三:轉map減小循環次數

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
    	vector<int> result;
		if (nums.size() < 2)
		{
			return result;	
		}

		map<int, int> mapNums;
		for (int i = 0; i < nums.size(); ++i)
		{
			int otherValue = target - nums[i];
			map<int, int>:: iterator it = mapNums.find(otherValue);
			if (it != mapNums.end() && it->second != i)
			{
				result.push_back(mapNums[otherValue]);
				result.push_back(i);
				break;
			}

			int num = nums[i];
			mapNums[num] = i;


		}

		return result;
	    }
};
複製代碼

解法四:繼續優化

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

    	vector<int> result;
    	map<int, int>:: iterator it;
		map<int, int> mapNums;
		for (int i = 0; i < nums.size(); ++i)
		{
			mapNums.insert(make_pair(nums[i], i));
			it = mapNums.find(target - nums[i]);
			if (it != mapNums.end() && it->second != i)
			{
				result.push_back(i);
				result.push_back(it->second);
				return result;
			}
		}
		return result;
	    }
};
複製代碼

交流學習

歡迎關注的個人公衆號,一塊兒學習交流,共同進步。 spa

RiverLi的公衆號
相關文章
相關標籤/搜索