PS:下面贴的这个代码是二分查找的那个,不是那个用map的我再写一遍吧。
map代码:
#include<map> #include<iostream> #include<vector> using namespace std; vector<int> TwoSum(vector<int> numbers, int target) { vector<int> result; map<int, int> hmap; for (int i = 0; i < numbers.size(); i++) { int x = target - numbers[i]; if (hmap.count(x) == 0) { hmap.insert(pair<int, int>(numbers[i], i)); } else { int j = hmap[x]; result.push_back(j + 1); result.push_back(i + 1); return result; } } return result; } int main() { vector<int> a = { 2, 7, 13, 4 }; vector<int> b = TwoSum(a, 9); for (int i = 0; i < 2; i++) { cout << b[i] << " "; } }
PS: STL真的很好用啊!!!!
本来这个题呢,是O(n2)但是试了一下,没过,这个在预期内!!然后想到了,查找target-a[i]这种方法,排序要O(nlgn),后来仔细一想,我还要保存排序前的的数组下表,而且这好像也不像算法OJ的考察方式吧。然后找了下答案,最后发现其实和我保存的方式差不多,只不过,别人利用map把search target-a[i] 的时间降到了O(1)时间,这就是用stl的好处。
二分查找代码:
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int> &numbers, int target) { 4 sort(numbers.begin(),numbers.end()); 5 int size = numbers.size(); 6 vector<int> result; 7 for (int i = 0; i < size; i++) 8 { 9 int t = target - numbers[i]; 10 int p = i + 1; 11 int r = size - 1; 12 int q = (p+r) / 2; 13 int j = i; 14 while (p <= r) 15 { 16 if (numbers[q] == t) 17 { 18 j = q; 19 break; 20 } 21 if (t<numbers[q]) 22 { 23 r = q - 1; 24 q = (p + r) / 2; 25 } 26 else 27 { 28 p = q + 1; 29 q = (p + r) / 2; 30 } 31 } 32 if (j > i) 33 { 34 result.push_back(i + 1); 35 result.push_back(j + 1); 36 return result; 37 } 38 } 39 return result; 40 } 41 };