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 class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
// Start typing your Java solution below
// DO NOT write main() function
Arrays.sort(num);
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(num.length < 3)
return res;
// 3 indexes
int i=0,j,k;
// 3 values
int a,b,c;
int len = num.length;
while(i<=len-3){
a=num[i];
j=i+1;
k=len-1;
while(j<k){
b=num[j];
c=num[k];
if(a+b+c==0){
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(a);
list.add(b);
list.add(c);
res.add(list);
// Very Important!!!
j++;
while(j<k && num[j]==b)
j++;
k--;
while(j<k && num[k]==c)
k--;
}
else if(a+b+c<0)
j++;
else
k--;
}
i++;
while(num[i]==a && i<=len-3)
i++;
}
return res;
}
}
------------------------------------------------------------------------------------------------------------------------------------------
LL's solution:
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
// Start typing your Java solution below
// DO NOT write main() function
int len = num.length;
if(len<3)
return new ArrayList<ArrayList<Integer>>();
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
//create hashmap
HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
for(int i = 0; i<len; i++){
if(map.containsKey(num[i])){
ArrayList<Integer> value = map.get(num[i]);
value.add(i);
map.put(num[i],value);
}
else{
ArrayList<Integer> value = new ArrayList<Integer>();
value.add(i);
map.put(num[i],value);
}
}
//iterate o(n^2)
for(int i = 1; i<len; i++)
for(int j=0; j<i; j++){
int a = num[i];
int b = num[j];
int c = 0-a-b;
if(map.containsKey(c)){
ArrayList<Integer> value = map.get(c);
for(int e:value){
if(e!=i&&e!=j){
//exist a triplet
ArrayList<Integer> triplet = new ArrayList<Integer>();
triplet.add(a);
triplet.add(b);
triplet.add(c);
Collections.sort(triplet);
if(res.indexOf(triplet)==-1)
res.add(triplet);
}
}
}
}
return res;
}