leetcode:Two Sum
struct Node { int val; int index; Node(){} Node(int x,int y):val(x),index(y){} }; bool compare(const Node &aa, const Node &bb) { return aa.val<bb.val; } class Solution { public: vector<int> twoSum(vector<int> &numbers, int target) { int i,j; vector<struct Node> node; int len = numbers.size(); for(i=0;i<len;i++) { node.push_back(Node(numbers[i],i+1)); } sort(node.begin(), node.end(), compare); vector<int> result; for(i=0,j=len-1;i<j;) { if(node[i].val+node[j].val>target) j--; if(node[i].val+node[j].val<target) i++; if(node[i].val+node[j].val==target) { if(node[i].index<node[j].index) { result.push_back(node[i].index); result.push_back(node[j].index); } else { result.push_back(node[j].index); result.push_back(node[i].index); } return result; } } } };
第二次:
class Solution { public: struct Node { int val; int index; Node(int i = 0, int j = 0):val(i),index(j){}; bool operator < (const Node &other) const { return val<other.val; } }; vector<int> twoSum(vector<int> &numbers, int target) { int len = numbers.size(); int i,j; vector<int>re; vector<Node>no(len); for(i=0;i<len;++i) { no[i].val = numbers[i]; no[i].index = i+1; } sort(no.begin(),no.end()); i=0; j=len-1; while(i<j) { if(no[i].val+no[j].val==target) { re.push_back(min(no[i].index,no[j].index)); re.push_back(max(no[i].index,no[j].index)); break; } else if(no[i].val+no[j].val>target) j--; else i++; } return re; } };
还有一个简单的方法,思路如下 :
1. 用hash表是否可解决,hash表的存的是target-numbers[i]的值,第一遍,hash[numbrs[i]] = target - numbers[i];
2. 第二次扫描的时候,对于numbers[i], 直接看hash[target-numbers[i]]是否有值,如果不为0,则找到了,再搜后面的,就可以找到一对
但这里有条件,因为,numbers的值范围不确定,可能还有负数。如果范围小,则可以使用这个方法
主要思想是排序后,一次就可以搜索出来
每天早上叫醒你的不是闹钟,而是心中的梦~