LeetCode:two sum
题目:

如果采取暴力搜索,复杂度为O(n2),会超时
解法1:
构建Node类,存储输入的数据和它们的下标。
用sort按升序排序(其中lambda可以写成一个返回值为bool类型的函数)。
设置i和j,分别指向容器的头和尾。如果和大于target,尾向前移,如果和小于target,头向后移。直至找出和等于target的两个值。
将其原始坐标加入结果容器中。
复杂度为O(nlogn)。
1 #include<vector> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 6 struct Node 7 { 8 int num; 9 int index; 10 }; 11 12 class Solution { 13 public: 14 vector<int> twoSum(vector<int> &numbers, int target) { 15 vector<Node> data; 16 vector<int> result; 17 18 for(int i=0;i!=numbers.size();++i) 19 { 20 Node node; 21 node.num=numbers[i]; 22 node.index=i+1; 23 data.push_back(node); 24 } 25 26 sort(data.begin(),data.end(),[](const Node &a,const Node &b){return a.num<=b.num;}); 27 28 int i=0,j=numbers.size()-1; 29 30 while(i!=j) 31 { 32 int sum=data[i].num+data[j].num; 33 34 if(sum<target) 35 { 36 ++i; 37 } 38 else if(sum>target) 39 { 40 --j; 41 } 42 else 43 { 44 break; 45 } 46 } 47 48 if(data[i].index>data[j].index){ 49 result.push_back(data[j].index); 50 result.push_back(data[i].index); 51 } 52 else 53 { 54 result.push_back(data[i].index); 55 result.push_back(data[j].index); 56 } 57 58 return result; 59 } 60 };
解法2:
使用map,利用map中的find函数来返回要找的值的迭代器
1 #include<map> 2 3 class Solution { 4 public: 5 vector<int> twoSum(vector<int> &numbers, int target) { 6 map<int,int> check_map; 7 vector<int> result; 8 9 for(int i=0;i!=numbers.size();++i) 10 { 11 check_map.insert(pair<int,int>(numbers[i],i+1)); 12 } 13 14 for(int i=0;i!=numbers.size();i++) 15 { 16 auto p=check_map.find(target-numbers[i]); 17 if(p!=check_map.end() && p->second!=i+1) /* 找到了,不能是自身 */ 18 { 19 if((i+1)>(p->second)) 20 { 21 result.push_back(p->second); 22 result.push_back(i+1); 23 } 24 else 25 { 26 result.push_back(i+1); 27 result.push_back(p->second); 28 } 29 break; /* 退出循环 */ 30 } 31 } 32 33 return result; 34 } 35 };

浙公网安备 33010602011771号