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)
先对集合S排序,这样耗费NO(logN)的时间,然后再分别计算三个数的和, 需要O(N)的时间复杂度,目前这是我能想到的时间复杂度和空间复杂比较低的方法了。不多说,C++代码如下:
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int> > ret;
int i, j, k, n = num.size();
sort(num.begin(), num.begin() + n);
for (i = 0; i < n; i++){
if (i > 0 && num[i] == num[i - 1]) continue;
k = n - 1;
j = i + 1;
while (j < k){
if (num[i] + num[j] + num[k] > 0) k--;
else if (num[i] + num[j] + num[k] < 0) j++;
else{
vector<int> tmp;
tmp.push_back(num[i]);
tmp.push_back(num[j]);
tmp.push_back(num[k]);
ret.push_back(tmp);
while (j < k && num[k] == num[k - 1]) k--;
while (j < k && num[j] == num[j + 1]) j++;
k--; j++;
}
}
}
return ret;
}
};