题目来源:计蒜客
给定一个数组,找到两个数,使得他们的和为一个给定的数值target。
函数twoSum返回两个数字index1,index2,
其中:number[index1] + number[index2]==target;
注意:index1必须小于index2且不能为0假设每一组输入只有唯一的一组解。
格式:第一行输入一个数n,接下来的两行分别输入数组number[n]和target,返回index1和index2.
例如:
Input:
numbers={2, 7, 11, 15},
target=9
Output:
index1=1, index2=2
提示:vector twoSum(vector &number, int target)
样例1
输入:
3
5 75 25
100
输出:
2 3
方法一:双指针
#include <iostream>
#include <vector>
using namespace std;
vector<int> twoSum(vector<int> &number, int target)
{
int index1, index2;
vector<int> v = number;
for (int i = 0; i < v.size(); i++)
{
for (int j = i + 1; j < v.size(); j++)
{
if (v[i] + v[j] == target)
{
index1 = i;
index2 = j;
}
}
}
vector<int> re;
re.push_back(index1+1);
re.push_back(index2+1);
return re;
}
int main(int argc, char **argv) {
int n,target;
cin>>n;
vector<int> nums;
int temp;
for(int i =0;i<n;i++)
{
cin>>temp;
nums.push_back(temp);
}
cin>>target;
vector<int> res;
res = twoSum(nums,target);
for(int j = 0;j < res.size();j++)
{
cout<<res[j]<<" ";
}
cout<<endl;
return 0 ;
}
方法二:Hash表
#include <iostream>
#include <vector>
#include <map>
using namespace std;
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> result;
map<int, int> hashMap;
for (int i = 0; i < numbers.size(); i++) {
if (!hashMap.count(numbers[i]))
hashMap.insert(pair<int, int>(numbers[i], i));
if (hashMap.count(target - numbers[i])) {
int n = hashMap[target - numbers[i]];
if (n < i) {
result.push_back(n + 1);
result.push_back(i + 1);
return result;
}
}
}
}
int main(int argc, char **argv) {
int n,target;
cin>>n;
vector<int> nums;
int temp;
for(int i =0;i<n;i++)
{
cin>>temp;
nums.push_back(temp);
}
cin>>target;
vector<int> res;
res = twoSum(nums,target);
for(int j = 0;j < res.size();j++)
{
cout<<res[j]<<" ";
}
cout<<endl;
return 0 ;
}
注:上面两种方法在计蒜客中都能AC。但是此题和LeetCode OJ上的Two Sum一样,用Hash表的方法可以AC。