LeetCode : 3 sum

解法:先排序,然后固定第一指针,第二和第三分别位于第一指针后面和尾部,向中间寻找。

        注意重复值的丢弃(如果不丢弃,会超时)

 1 class Solution {
 2 public:
 3     vector<vector<int> > threeSum(vector<int> &num) {
 4         vector<int> tmp;
 5         vector<vector<int> > result;
 6 
 7         sort(num.begin(),num.end());     /*先排序,再查找*/
 8 
 9         for(int i=0;i!=num.size();++i)
10         {
11             if(i>0 && (num[i]==num[i-1]))    /*找出与前一个数不一样的数*/
12             {
13                 continue;
14             }
15 
16             for(int j=i+1,k=num.size()-1;j<k;)   /*初始j代表i后面的第一个元素,k代表最后一个元素*/
17             {
18                 if(j>i+1 && num[j]==num[j-1])    /*如果j和前一个元素相等,不用比较,直接后移*/
19                 {
20                     ++j;
21                     continue;
22                 }
23                 if(k<num.size()-1 && num[k]==num[k+1])    /*如果k和后一个元素相等,不用比较,直接前移*/
24                 {
25                     --k;
26                     continue;
27                 }
28 
29                 int sum=num[i]+num[j]+num[k];
30                 if(sum>0)     /*根据大小关系移动j和k的指向(i固定不变)*/
31                 {
32                     --k;
33                 }
34                 else if(sum<0)
35                 {
36                     ++j;
37                 }
38                 else
39                 {
40                     tmp.push_back(num[i]);
41                     tmp.push_back(num[j]);
42                     tmp.push_back(num[k]);
43                     result.push_back(tmp);
44                     tmp.clear();       /*每次用完tmp要清空*/
45                     ++j;
46                 }
47             }
48         }
49         return result;
50     }
51 };
View Code

 

posted @ 2014-07-30 11:11  又软又暖的小喵  阅读(120)  评论(0)    收藏  举报