class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
vector<int> t;
sort(nums.begin(), nums.end());
vector<int>::iterator i, p, q, k;
for (k = nums.begin(); k != nums.end() && *k < 0; k ++);
for (i = nums.begin(); i != nums.end(); i ++){
bool b = *i < 0;
for (p = b? k: nums.begin(), q = b? nums.end() - 1: k - 1; *i != 0 && p < q;){
if (*p + *q == -(*i)){
t.clear();
t.push_back(*i); t.push_back(*p); t.push_back(*q);
ans.push_back(t);
while (p < q && *(p + 1) == *p)
p ++;
while (q > p && *(q - 1) == *q)
q --;
p ++;
q --;
}
else if (*q + *p < - (*i))
p ++;
else
q --;
}
int count = 1;
while(i < nums.end() - 1 && *(i + 1) == *i){
i ++;
count ++;
}
if (*i == 0 && count >= 3){
t.clear();
t.push_back(0); t.push_back(0); t.push_back(0);
ans.push_back(t);
}
}
return ans;
}
};