LeetCode-Two Sum

题目看起来很简单,很容易想到直接排序后二分查找,时间复杂度是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 };
原文地址:https://www.cnblogs.com/chasuner/p/twosum.html