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 };
View Code

 

 

解法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 };
View Code

 

posted @ 2014-07-25 16:38  又软又暖的小喵  阅读(132)  评论(0)    收藏  举报