Two sum
Given anarray of integers, returnindicesof the two numbers such that they add up to aspecific target.You may assume that each input would haveexactlyone solution.
已知一个整数数组,返回两个加和等于指定值的索引。
解题思路1:从第一个元素num[i]开始遍历,查找之后的元素是否有值等于target- num[i]。如果有,则将将这两元素的index返回。这个方式的核心是查找。
错误方案:为了方便查找,使用STL中的map,map将
错误的代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> index(2,0);
map<int,int> mp;
for (int i=0;i<nums.size();i++)
mp.insert(pair<int,int>(nums[i],i));
for (int i=0;i<nums.size()-1;i++)
{
int res=target-nums[i];
if (mp.find(res)!=mp.end())
{
int j=mp[res];
if (j>i)
{
index[0]=i;
index[1]=j;
return index;
}
}
}
return index;
}
};
无法通过的测试样例
Input:
[0,4,3,0]
0
Output: [0,0]
Expected:
[0,3]
正确方案:使用multimap,它相比于map,允许重复值出现
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> index(2,1);
multimap<int,int> mp;
for (int i=0;i<nums.size();i++)
mp.insert(make_pair(nums[i],i));
//mp.insert(pair<int,int>(nums[i],i));
for (int i=0;i<nums.size()-1;i++)
{
int res=target-nums[i];
multimap<int,int>::iterator it;
it=mp.find(res);
for(int k=0;k!=mp.count(res);k++,it++)
{
int j=it->second;
if ((j>i)&&(j<nums.size()))
{
index[0]=i;
index[1]=j;
return index;
}
}
}
return index;
}
};
解题思路2:先将这组数据从小到大排序,然后对排序的数据分别从前往后和从后往前遍历。假设i和j分别为头和尾的标记。如果nums[i]+nums[j]>target,则i++;如果nums[i]+nums[j]
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> index1(2,0);
vector<int> index;
vector<int> bk(nums);//备份数组值
sort(bk.begin(),bk.end());//排序
int j=nums.size()-1;
int i=0;
while(i<j){
if(bk[i]+bk[j]==target)
{
index1[0]=i;
index1[1]=j;
break;
} else if (bk[i]+bk[j]>target){
j=j-1;
} else if (bk[i]+bk[j]<target){
i=i+1;
}
}
int n=0;
for (int i=0;i<nums.size();i++)
{
if (nums[i]==bk[index1[0]]||nums[i]==bk[index1[1]])
{
index.push_back(i);
n=n+1;
}
if (n==2)
{
break;
}
}
return index;
}
};