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