LeetCode(15. 3Sum)

 

题目:

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.

给定一个数组,求出所有三个数的组合,这些组合的和为0,且组合中的数字要按非递减的顺序。另外,组合不能出现重复

思路:

1. 对数组进行排序,从小到大

2. 每次假定选择的第一个数为 num[i],那么剩下的两个数则从[i + 1, size -1] 中寻找,时间复杂为O(n^2)

3. 去重:

  1) 第一个数发生重复

  2)后面两个数的组合发生重复(第二个数和第三个数都相同)

 1 public:
 2      vector<vector<int> > threeSum(vector<int> &num) {
 3         vector<vector<int>> result;
 4         int nsize = num.size();
 5         sort(num.begin(), num.end());
 6         for(int i = 0; i < nsize; i++){
 7             if(i != 0 && num[i] == num[i-1])
 8                 continue;
 9             int p = i + 1, q = nsize - 1;
10             while(p < q){
11                 if(num[i] + num[q] + num[p] > 0)
12                     --q;
13                 else if(num[i] + num[q] + num[p] < 0)
14                     ++p;
15                 else{
16                     vector<int> tmp;
17                     tmp.push_back(num[i]);
18                     tmp.push_back(num[p]);
19                     tmp.push_back(num[q]);
20                     result.push_back(tmp);
21                                         
22                     while(++p < q && num[p] == num[p-1]);
23                     while(p < --q && num[q] == num[q+1]);                     
24                 }
25             }
26         }
27         return result;
28     }
29 };

 

posted @ 2016-03-28 21:57  huapyuan  阅读(94)  评论(0)    收藏  举报