如果是有序数组,很简单。两头指针往中间相遇即可。
因此对于无序数组,排序即可。
唯一的麻烦题目要求的:要返回两个数在排序之前原数组里的序号。因此我需要在排序时也要保留原来的序列号。
这里主要是以前不写STL的程序。这里用到vector。pair。sort。
vector常用到的vector.size()表示当前vector里的数据个数。
初始化vector时用 vector<元素类型> v; 这样就定义了一个空的vector。添加元素使用v.push_back()。访问时可用v[i],但添加元素时不可以。
对vector排序可以使用stl自带的方法:
sort(v.begin(), v.end(), myfun);
其中如果v的元素不是int这样的简单类型,需要自己写一个myfun函数来告诉程序到底比较的是什么。
pair是一个很好用的结构。
这里我用pair把数组的数据和编号绑定在了一起。
在最后我遇到了一个问题:
编译出错,搜到的解决访问在这里。
可能和类成员函数的函数原型有关。因为类的所有成员函数都有一个隐含的指针参数,即this。但是stl的所要求的sort自定义函数是不要this指针的。这就和sort需要的比较函数原型不一致了,所以就报错了。所以设置成static函数,因为他天生不带this指针。
http://blog.youkuaiyun.com/flybywind/article/details/7536311
class Solution {
public:
static bool myfun(const pair<int, int> a, const pair<int, int> b)
{
return a.first < b.first;
}
vector<int> twoSum(vector<int> &numbers, int target) {
int i,j;
vector< pair<int, int> > index;
for(i=0;i<numbers.size();i++)
{
pair<int, int> tmp;
tmp.first = numbers[i];
tmp.second = i+1;
index.push_back(tmp);
}
sort(index.begin(), index.end(), myfun);
i = 0;
j = index.size() - ;
while(i<j)
{
if(index[i].first + index[j].first >target)
j--;
else if(index[i].first + index[j].first <target)
i++;
else
break;
}
vector<int> result;
int idx1,idx2;
if(index[i].second < index[j].second)
{
idx1 = index[i].second;
idx2 = index[j].second;
}
else
{
idx2 = index[i].second;
idx1 = index[j].second;
}
result.push_back(idx1);
result.push_back(idx2);
return result;
}
};
Hash方法:可以考虑使用hash。将数组的每个元素以元素值位key,下标为value存入hash表。然后第二次遍历时,在hash中查询target做减法后的差值,hash表中存在该差值就算找到了。注意一点:当数组中存在重复元素时,注意hash表该如何查找;两个数不能为同一个数。
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
unordered_map<int, int> hashtable;
vector<int> result;
int n = numbers.size();
for(int i=0;i<n;i++)
hashtable[numbers[i]] = i+1;
for(int i=0;i<n;i++)
{
int other = target - numbers[i];
if(hashtable.find(other) != hashtable.end())
{
int j = hashtable[other];
if(i+1 == j)
continue;
result.push_back(i+1);
result.push_back(j);
break;
}
}
return result;
}
};