题目看起来很简单,很容易想到直接排序后二分查找,时间复杂度是O(nlogn),不过要找出的是两个数在原数组中的索引,而不是这两个数本身,所以必须记录每个数原来的位置,可能有人会想到用map,由于可能有相同数值的两个数,所以map是不行的。那就用包含数和位置的struct吧,其实不用那么麻烦,直接用一个包含pair<int, int>的数组就可以了,不过注意sort的比较函数要定义到class的外部,否则调用的时候找不到函数,或者定义为类的static成员函数也是可以的。
1 bool compare(pair<int, int> a, pair<int, int> b) { 2 return a.first < b.first; 3 } 4 class Solution { 5 public: 6 vector<int> twoSum(vector<int> &numbers, int target) { 7 // Start typing your C/C++ solution below 8 // DO NOT write int main() function 9 int length = numbers.size(); 10 int index1, index2; 11 vector<pair<int, int>> numvec(length); 12 for (int i = 0; i < length; i++) { 13 numvec[i] = pair<int, int>(numbers[i], i); 14 } 15 sort(numvec.begin(), numvec.end(), compare); 16 for (int i = length - 1; i >= 0; --i) { 17 index1 = binarysearch(numvec, target - numvec[i].first); 18 if (index1 != -1) { 19 index2 = numvec[i].second; 20 break; 21 } 22 } 23 vector<int> ret; 24 if (index1 > index2) { 25 int tmp = index1; 26 index1 = index2; 27 index2 = tmp; 28 } 29 ret.push_back(index1 + 1); 30 ret.push_back(index2 + 1); 31 return ret; 32 } 33 int binarysearch(vector<pair<int, int>> &numvec, int key) { 34 int loc = -1; 35 int low = 0; 36 int high = numvec.size() - 1; 37 int middle; 38 if (key > numvec[high].first || key < numvec[low].first) { 39 return loc; 40 } 41 while (low <= high) { 42 middle = (low + high) / 2; 43 if (numvec[middle].first == key) { 44 return numvec[middle].second; 45 break; 46 } 47 else if (numvec[middle].first < key) { 48 low = middle + 1; 49 } 50 else { 51 high = middle - 1; 52 } 53 } 54 return loc; 55 } 56 };