题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
分析:
暴力法两层循环,时间复杂度是
n
2
n^{2}
n2,所以不考虑。
一开始的思路是用map来存放数组的元素(key)和对应位置(values),但map容器不能存放相同的key,对数组中有相同元素的情况只能加入最先出现的那个,所以用multimap代替map,它与map的区别是可以存放相同的key。map/multimap中的元素都是按key有序存放的,所以在multimap中相同的key一定会相邻。
注:这是为了解决 t a r g e t = 2 x target=2{x} target=2x,且在数组中有两个 x x x的情况。
用find函数来定位数据出现位置,它返回一个迭代器,当数据出现时,它返回数据所在位置的迭代器。如果map/multimap中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
代码如下:
class Solution
{public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> result;
int length = nums.size();
multimap<int,int> temp;
for (int i=0;i < length;i++)
{
temp.insert(make_pair(nums[i],i));
}
for (int j=0;j < length;j++)
{
int fir = target - nums[j];
int time = temp.count(nums[j]);
if (fir != nums[j] && temp.count(fir) != 0)
{
result.push_back(j);
multimap<int, int>::iterator findit = temp.find(fir);
if (findit != temp.end())
{
result.push_back(findit->second);
}
break;
}
else if (fir == nums[j] && time == 2)
{
multimap<int,int>::iterator beg = temp.find(fir);
if (beg != temp.end())
{
for (int k=0;k!=2; k++ , beg++)#相同key相邻,向后移动即可
{
result.push_back(beg->second);
}
}
break;
}
}
return result;
}
};
执行结果:
测试用例: