Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
Note:
- Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
- The solution set must not contain duplicate quadruplets.
For example, given array S = {1 0 -1 0 -2 2}, and target = 0. A solution set is: (-1, 0, 0, 1) (-2, -1, 1, 2) (-2, 0, 0, 2)
import java.util.Iterator;
public class Solution {
class TwoSum{
public int index1;
public int index2;
public int sum;
TwoSum(int index1, int index2, int sum){
this.index1=index1;
this.index2=index2;
this.sum=sum;
}
}
boolean contain(ArrayList<ArrayList<Integer>> listOfList, ArrayList<Integer> list){
for(int i=0; i<listOfList.size(); i++){
if(listOfList.get(i).get(0).equals(list.get(0))
&& listOfList.get(i).get(1).equals(list.get(1))
&& listOfList.get(i).get(2).equals(list.get(2)) )
return true;
}
return false;
}
public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
// Start typing your Java solution below
// DO NOT write main() function
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(num.length < 4) return res;
HashMap<Integer, List<TwoSum>> tsMap = new HashMap<Integer, List<TwoSum>>();
// get all two sum pairs.
for(int i=0; i<num.length-1; i++){
for(int j=i+1; j<num.length; j++){
int sum = num[i]+num[j];
TwoSum ts = new TwoSum(i,j, sum);
List<TwoSum> tsList = tsMap.get(sum);
if(tsList == null){
tsList = new ArrayList<TwoSum>();
tsMap.put(sum, tsList);
}
tsList.add(ts);
}
}
Iterator it = tsMap.entrySet().iterator();
while(it.hasNext()){
Map.Entry pairs = (Map.Entry) it.next();
int a = (Integer) pairs.getKey();
List<TwoSum> tsList = (List<TwoSum>)pairs.getValue();
List<TwoSum> tsList1 = (List<TwoSum>) tsMap.get(target-a);
if(tsList1 != null){
for(TwoSum ts:tsList){
for(TwoSum ts1:tsList1){
// Avoid reuse of any elements in num[]
if(ts.index1 == ts1.index1) continue;
if(ts.index1 == ts1.index2) continue;
if(ts.index2 == ts1.index1) continue;
if(ts.index2 == ts1.index2) continue;
ArrayList<Integer> resItem = new ArrayList<Integer>();
resItem.add(num[ts.index1]);
resItem.add(num[ts.index2]);
resItem.add(num[ts1.index1]);
resItem.add(num[ts1.index2]);
Collections.sort(resItem);
// Add resItem into res and ignore duplicated ones
if(!contain(res, resItem))
res.add(resItem);
}
}
}
else
continue;
}
return res;
}
}
#use hashset to filtering duplicated solution set#
import java.util.Iterator;
public class Solution {
class TwoSum{
public int index1;
public int index2;
public int sum;
TwoSum(int index1, int index2, int sum){
this.index1=index1;
this.index2=index2;
this.sum=sum;
}
}
public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
// Start typing your Java solution below
// DO NOT write main() function
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(num.length < 4) return res;
HashMap<Integer, List<TwoSum>> tsMap = new HashMap<Integer, List<TwoSum>>();
// get all two sum pairs.
for(int i=0; i<num.length-1; i++){
for(int j=i+1; j<num.length; j++){
int sum = num[i]+num[j];
TwoSum ts = new TwoSum(i,j, sum);
List<TwoSum> tsList = tsMap.get(sum);
if(tsList == null){
tsList = new ArrayList<TwoSum>();
tsMap.put(sum, tsList);
}
tsList.add(ts);
}
}
HashSet<ArrayList<Integer>> hs = new HashSet<ArrayList<Integer>>();
Iterator it = tsMap.entrySet().iterator();
while(it.hasNext()){
Map.Entry pairs = (Map.Entry) it.next();
int a = (Integer) pairs.getKey();
List<TwoSum> tsList = (List<TwoSum>)pairs.getValue();
List<TwoSum> tsList1 = (List<TwoSum>) tsMap.get(target-a);
if(tsList1 != null){
for(TwoSum ts:tsList){
for(TwoSum ts1:tsList1){
// Avoid reuse of any elements in num[]
if(ts.index1 == ts1.index1) continue;
if(ts.index1 == ts1.index2) continue;
if(ts.index2 == ts1.index1) continue;
if(ts.index2 == ts1.index2) continue;
ArrayList<Integer> resItem = new ArrayList<Integer>();
resItem.add(num[ts.index1]);
resItem.add(num[ts.index2]);
resItem.add(num[ts1.index1]);
resItem.add(num[ts1.index2]);
Collections.sort(resItem);
// Add resItem into res and ignore duplicated ones
if(!hs.contains(resItem)){
hs.add(resItem);
res.add(resItem);
}
}
}
}
else
continue;
}
return res;
}
}