Solution #1, sort then look for match, O(nlogn)
struct Node { int val; int index; Node(){} Node(int v,int i):val(v),index(i) {} }; bool comp (const Node &left, const Node &right) { return left.val < right.val; } class Solution { public: vector<int> twoSum(vector<int> &numbers, int target) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<Node> boo; for (int i=0;i<numbers.size();i++) { boo.push_back(Node(numbers[i],i+1)); } sort(boo.begin(),boo.end(),comp); int frontI = 0; int backI = boo.size() - 1; while (frontI < backI) { int sum = boo[frontI].val + boo[backI].val; if (sum == target) { int minI = min(boo[frontI].index,boo[backI].index); int maxI = max(boo[frontI].index,boo[backI].index); vector<int> re; re.push_back(minI); re.push_back(maxI); return re; } else if (sum < target) { frontI++; }else { backI--; } } } };Solution #2, hashmap, O(n)
class Solution { public: vector<int> twoSum(vector<int> &numbers, int target) { // Start typing your C/C++ solution below // DO NOT write int main() function unordered_map<int,int> mapping; vector<int> result; for (int i=0;i<numbers.size();i++) { if (mapping.find(numbers[i]) == mapping.end()) { mapping[numbers[i]] = i + 1; }else if (numbers[i] * 2 == target) { result.push_back(mapping[numbers[i]]); result.push_back(i+1); return result; } } for (int i=0;i<numbers.size();i++) { int remainder = target - numbers[i]; if (remainder * 2 != target && mapping.find(remainder) != mapping.end()) { result.push_back(i+1); result.push_back(mapping[remainder]); return result; } } return result; } };Added on Sep-02-2014
Solution #3
class Solution { public: vector<int> twoSum(vector<int> &numbers, int target) { vector<int> ret(2); unordered_map<int,int> mapping; unordered_map<int,int>::iterator itr; for (int i = 0; i < numbers.size(); i++) { itr = mapping.find(numbers[i]); if (itr == mapping.end()) { mapping.insert(make_pair(numbers[i],i + 1)); }else { if (numbers[i] + itr->first == target) { ret[0] = itr->second; ret[1] = i + 1; return ret; } } } for (int i = 0; i < numbers.size(); i++) { itr = mapping.find(target - numbers[i]); if (itr != mapping.end() && itr->second != i + 1) { ret[0] = i + 1; ret[1] = itr->second; return ret; } } return ret; } };