给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
这是数据结构练习数组的结构的一个题目,有两个思路:
1、先将数组排序,使用对撞指针的办法找到需要的两个值,再从原来的数组中找到符合要求的两个数的序号。
int GetVectorIndex(vector<int> nums, int value)
{
int i=-1;
for (i=0; i<nums.size(); i++)
{
if (nums[i] == value)
{
return i;
}
}
return i;
}
int ReverseGetVectorIndex(vector<int> nums, int value)
{
int i=-1;
for (i=nums.size()-1; i<nums.size(); i--)
{
if (nums[i] == value)
{
return i;
}
}
return i;
}
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> tempNums = nums;
vector<int> vInt;
sort(tempNums.begin(), tempNums.end());
int head = 0;
int tail = tempNums.size()-1;
while (true)
{
if (head >= tail)
{
break;
}
if (tempNums[head] + tempNums[tail] == target)
{
vInt.push_back(GetVectorIndex(nums, tempNums[head]));
vInt.push_back(ReverseGetVectorIndex(nums, tempNums[tail]));
sort(vInt.begin(), vInt.end());
return vInt;
}
else if (tempNums[head] + tempNums[tail] < target)
{
head ++;
}
else
{
tail--;
}
}
return vInt;
}
2、大神解法,遍历这个数组,使用map,每个数值作为key,对应的序号作为value。先查找target-nums[i]是否在数组中,在则直接输出,不在则插入map。
此算法效率很高,非常巧妙的解决了输出序号的问题。
vector<int> twoSum(vector<int>& nums, int target)
{
map<int, int> injection;
for (int i = 0; i < nums.size(); ++i)
{
if (injection.find(target - nums[i]) != injection.end())
return vector<int>({ injection[target - nums[i]],i });
injection.insert({ nums[i],i });
}
return vector<int>();
}