leetcode-two sum

梦想游戏人
目录:
algorithm

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

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

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

常规方法肯定超时,所以用查表来解决,但是提交后发现ERROR 因为测试数据可能是负数,所以换成map

class Solution1 {
public:
	vector<int> twoSum(vector<int>& nums, int target)
	{
		static int cache[99999] = { -1 };//缓存数字 该数字可能重复值

		for (int i = 0; i < 99999; i++)
		{
			cache[i] = -1;
		}
		static vector<int> cache1[99999];//缓存该数字的index

		for (int i = 0; i < nums.size(); i++)
		{
			cache[i] = nums[i];
			int index = nums[i];
			auto &v = cache1[index];

			v.push_back(i);
	

		}


		int x = 0, y = 0;


		for (int i = 0; i < nums.size(); i++)
		{
			int delta = target - nums[i];
			if (delta < 0)continue;
			if (cache1[delta].size() == 0)continue;
			if (cache1[nums[i]].size() == 0)continue;
			x = cache1[delta][0];
			int ii = 0;
			if (cache1[delta].size() != 1)ii = 1;

			for (; ii < cache1[delta].size(); ii++)
			{


				if (cache1[delta][ii] != 0)
				{

					y = cache1[nums[i]][ii];



					if (x > y) return{ y, x };


					return{ x, y };
				}
			}

		}
		return{ -1, -1 };
	}
};

class Solution {
public:
	vector<int> twoSum(vector<int>& nums, int target)
	{
		std::map<int, int>m;
		for (int i = 0; i < nums.size(); i++)
		{
			m[nums[i]] = i;//缓存 数字的index
		}

		for (int i = 0; i < nums.size(); i++)
		{
			int delta = target - nums[i];
			auto res= m[delta];
		
			if (res!=0)
			{
				return{ i, res};
			}
		}


	}
};
Scroll Up