如果是有序数组,很简单。两头指针往中间相遇即可。
因此对于无序数组,排序即可。
唯一的麻烦题目要求的:要返回两个数在排序之前原数组里的序号。因此我需要在排序时也要保留原来的序列号。
这里主要是以前不写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.csdn.net/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; } };