//C++
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
sort(nums.begin(), nums.end());
vector<vector<int>> res;
for (unsigned int i=0; i<nums.size(); i++)
{
if ((i>0) && (nums[i]==nums[i-1]))
continue;
int l = i+1, r = nums.size()-1;
while (l<r) {
int s = nums[i]+nums[l]+nums[r];
if (s>0) r--;
else if (s<0) l++;
else {
res.push_back(vector<int> {nums[i], nums[l], nums[r]});
while (l < (nums.size() - 1)&&(nums[l] == nums[l + 1])) l++;
while (r > l && (nums[r] == nums[r - 1])) r--;
l++; r--;
}
}
}
return res;
}
};
//java
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans= new ArrayList<>();
Arrays.sort(nums);
for(int i=0;i<nums.length;i++)
{
if(nums[i]>0) break;
if(i>0&&nums[i]==nums[i-1]) continue;
int L=i+1;
int R=nums.length-1;
while(L<R)
{
int a=nums[i]+nums[L]+nums[R];
if(a==0)
{
List<Integer>aa=new ArrayList<>();
aa.add(nums[i]);
aa.add(nums[L]);
aa.add(nums[R]);
ans.add(aa);
while (L<R && nums[L] == nums[L+1]) L++;
while (L<R && nums[R] == nums[R-1]) R--;
L++;
R--;
}
if(a<0) {L++;}
if(a>0) {R--;}
}
}
return ans;
}
}