算法训练-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的公众号
相关文章
相关标签/搜索