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)
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> resList = new ArrayList<List<Integer>>();
//dertermine the length of the array
if(nums.length<3)
return resList;
//first of all, need to sort the array
Arrays.sort(nums);
int n=nums.length,j,k;
for(int i=0;i<n-2;i++){
if(i==0 || nums[i]>nums[i-1]){
if (nums[i]>0) break;
j=i+1;
k=n-1;
//using two pointers here
while(j<k){
if(nums[i]+nums[j]>0 && nums[j]>0) break;
if(nums[i]+nums[j]+nums[k] == 0){
List<Integer> res=new ArrayList<Integer>();
res.add(nums[i]);
res.add(nums[j]);
res.add(nums[k]);
resList.add(res);
j++;
k--;
//to handle duplicate records
while(j<k && nums[k]==nums[k+1]) k--;
while(j<k && nums[j]==nums[j-1]) j++;
}else if(nums[i]+nums[j]+nums[k] < 0)
j++;
else
k--;
}
}
}
return resList;
}
}