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

 

你可能感兴趣的:(LeetCode)