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 };
                	}
                };
                

方案二:map 查找(正确解法)

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};
                			}
                		}
                
                
                	}
                };