classSolution { public: vector<int> twoSum(vector<int>& numbers, int target){ unordered_map<int, int> m; for (int i = 0; i < numbers.size(); i ++) { if (m.count(target - numbers[i])) return {m[target - numbers[i]], i + 1}; else m[numbers[i]] = i + 1; } return {-1, -1}; } };
classSolution { public: vector<int> twoSum(vector<int>& numbers, int target){ int i = 0, j = numbers.size() - 1; while (i < j) { if (numbers[i] + numbers[j] > target) j --; elseif (numbers[i] + numbers[j] < target) i ++; elsereturn {i + 1, j + 1}; } return {-1, -1}; } };
时间复杂度为$O(n)$。
空间复杂度为$O(1)$。
二分查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { public: vector<int> twoSum(vector<int>& numbers, int target){ for (int i = 0; i < numbers.size(); i ++) { int diff = target - numbers[i]; int l = i + 1, r = numbers.size() - 1; int mid; while (l < r) { mid = l + r >> 1; if (numbers[mid] >= diff) r = mid; else l = mid + 1; } if (numbers[l] == diff) return {i + 1, l + 1}; } return {-1, -1}; } };