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.
For example, given array S = {-1 0 1 2 -1 -4}, A solution set is: (-1, 0, 1) (-1, -1, 2)
</pre><pre style="overflo算法说明:http://blog.csdn.net/nanjunxiao/article/details/12524405
class Solution { public: vector<vector<int> > threeSum(vector<int> &num) { int size = num.size(); vector<vector<int> > result; if( size < 3) return result; //排序 int *number = new int[size]; for( int i = 0; i < size; i++) number[i] = num[i]; QuickSort(number, size); //求三角数 for( int i = 0;i < size - 2; i++) { if( number[i] == number[i-1] && i != 0 ) continue; int sum = -number[i]; int mid = i + 1; int right = size - 1; while(mid < right) { if( number[mid] == number[mid -1] && mid > i+1) { mid ++; continue; } int tmp = number[mid] + number[right]; if(tmp < sum) mid ++; else if( tmp > sum)right --; else { vector<int> tri; tri.push_back( number[i] ); tri.push_back( number[mid] ); tri.push_back( number[right] ); result.push_back(tri); mid ++; right --; } } } delete []number; return result; } //从小到大排序 void QuickSort(int *num, int size) { if( size <= 1) return; int mid = num[size - 1],tmp,j = 0; for(int i = 0; i < size - 1; i ++) { if( num[i] < mid) { tmp = num[i]; num[i] = num[j]; num[j] = tmp; j++; } } num[size - 1] = num[j]; num[j] = mid; if(j > 1) QuickSort(num, j ); if(j < size - 2) QuickSort(num + j + 1, size - j - 1); } };