LeetCode题解——3Sum

题目

给定一个数组,找出其中和为0的所有3个数的组合。每个组合的3个数都是非递降的。

 

解法

先排序再遍历,设置3个指针,第一个依次遍历,第二三个在第一个指针后面的部分里,左右夹逼查找和为第一个数的相反数的组合。时间O(N2)。

 

代码

 1 class Solution {
 2 public:
 3     vector<vector<int> > threeSum(vector<int> &num) {
 4         vector<vector<int> > result;
 5         if(num.size() < 3)
 6             return result;
 7             
 8         sort(num.begin(), num.end());  //排序
 9         
10         for(int a = 0; a < num.size() - 2; ++a)  //a指向第一个数
11         {
12             if(num[a] > 0)  //如果第一个数>0
13                 break;
14                 
15             if(a > 0 && num[a] == num[a-1])  //如果和上一个重复,则前进一个
16                 continue;
17                 
18             for(int b = a + 1, c = num.size() - 1; b < c; ) //b、c分别指向第二个数和第三个数,左右夹逼
19             {
20                 if(b > a + 1 && num[b] == num[b-1])  //和上一个重复,则前进1
21                 {
22                     ++b;
23                     continue;
24                 }
25                 if(c < num.size() - 1 && num[c] == num[c+1])  //同上
26                 {
27                     --c;
28                     continue;
29                 }
30                 
31                 int sum = num[a] + num[b] + num[c];
32                 if(sum == 0)
33                 {
34                     result.push_back({num[a], num[b], num[c]});
35                     ++b; 
36                     --c;
37                 }
38                 else if(sum > 0)39                     --c;
40                 else
41                     ++b;
42             }
43         }
44         
45         return result;
46     }
47 };

 

posted @ 2014-06-03 23:05  阿杰的专栏  阅读(280)  评论(0编辑  收藏  举报