LeetCode上的一个题:
给定一个数组,寻找在这个数组中是否存在两个数之和为某个定值。
要点:
1、一个数就是一个数,比如[2, 1],寻找和为4时,不能使用2+2。
2、需要输出位置。
排序方法
首先排序,然后按照编程之美中提到的方法进行处理。代码如下.
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class node
{
public:
int id;
int value;
public:
node(int a, int b):id(a), value(b){}
friend bool operator < (const node &a, const node &b) { return a.value < b.value;}
};
vector<int> twoSum(vector<int> vs, int target)
{
const int s = vs.size();
vector<int> ret;
vector<node> temp;
for (int i = 0; i < s; ++i)
temp.push_back(node(i+1, vs[i]));
sort(temp.begin(), temp.end());
for (int b = 0, e = s - 1; b < e; )
{
const int v = temp[b].value + temp[e].value;
if (v == target)
{
if (temp[b].id < temp[e].id)
{
ret.push_back(temp[b].id);
ret.push_back(temp[e].id);
}
else
{
ret.push_back(temp[e].id);
ret.push_back(temp[b].id);
}
return ret;
}
else if (v < target)
{
++b;
}
else --e;
}
return ret;
}
需要注意的时,放入结果时大小的顺序,要求是按照索引从小到大的顺序放到vector中。
建立hash方法
首先遍历整个数组,然后建立一个hash表,再在这个hash表中查找给定和为s的两个值。比如a 与 s - a如果同时存在,则可。
#include<stdio.h>
#include<stdlib.h>
#include<set>
#include<iostream>
#include<hash_map>
using namespace std;
using namespace stdext;
vector<int> twoSum(vector<int> vs, int target)
{
hash_map<int, int> rec;
vector<int> ret;
const int s = vs.size();
for (int i = 0; i < s; ++i)
rec.insert(pair<int, int>(vs[i], i + 1));
for (int i = 0; i < s; ++i)
{
const int v = vs[i];
hash_map<int, int>::iterator iter = rec.find(target - v);
if (rec.end() != iter && iter->second != (i+1))
{
const int j = iter->second;
if (i < j) {ret.push_back(i+1); ret.push_back(j);}
else {ret.push_back(j); ret.push_back(i+1);}
return ret;
}
}
return ret;
}
int main(void)
{
int a[] = {150,24,79,50,88,345,3};
vector<int> vs;
for (int i = 0; i < sizeof(a)/sizeof(int); ++i)
{
vs.push_back(a[i]);
}
vector<int> ret = twoSum(vs, 200);
cout << ret[0] << ' ' << ret[1] << endl;
return 0;
}