LeetCode(15. 3Sum)
题目:
Given an array S of n integers, are there elements a, b, c 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 };

浙公网安备 33010602011771号