# LeetCode – 4Sum (Java)

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)

Thoughts

A typical k-sum problem. Time is N to the power of (k-1).

Java Solution

 public ArrayList> fourSum(int[] num, int target) { Arrays.sort(num);   HashSet> hashSet = new HashSet>(); ArrayList> result = new ArrayList>();   for (int i = 0; i < num.length; i++) { for (int j = i + 1; j < num.length; j++) { int k = j + 1; int l = num.length - 1;   while (k < l) { int sum = num[i] + num[j] + num[k] + num[l];   if (sum > target) { l--; } else if (sum < target) { k++; } else if (sum == target) { ArrayList temp = new ArrayList(); temp.add(num[i]); temp.add(num[j]); temp.add(num[k]); temp.add(num[l]);   if (!hashSet.contains(temp)) { hashSet.add(temp); result.add(temp); }   k++; l--; } } } }   return result; }

Here is the hashCode method of ArrayList. It makes sure that if all elements of two lists are the same, then the hash code of the two lists will be the same. Since each element in the ArrayList is Integer, same integer has same hash code.

 int hashCode = 1; Iterator i = list.iterator(); while (i.hasNext()) { E obj = i.next(); hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode()); }
Category >> Algorithms
If you want someone to read your code, please put the code inside <pre><code> and </code></pre> tags. For example:
<pre><code>
String foo = "bar";
</code></pre>
• Matias SM

I think you don’t need the Set to avoid duplicates if you check for each idx that the current value is different from the last one used. (same logic used in 3Sum solution)

• Rahul Nakkanwar

agreed…hashset is not required here

• Renzo
• Charles Gao

You could simply check if the temp already exist by using result.contains(temp) instead of using HashSet.

• Rohit

For checking duplicate can we do this ?
whenever we find the match get the sum of the i+j+k+l and store it in arraylist and everytime we find a match we can check if that sum exists in the arraylist if not its a new match or else already found.

• Jinyao Xu

why not give it a try?

• ryanlr

The array is sorted at the beginning.

• ryanlr

Good idea!

• VIVEK VERMA

Shouldn’t it be TreeSet or something instead of ArrayList. The order does matter while comparing one ArrayList to another.

• Jinyao Xu

One style optimization of your code is that you don’t need to use both hashset and result.
You just need the hashset.
Set<List> hashset = new HashSet();
When you add tuple of 4, do this:
hashset.add(Arrays.asLists(a, b, c, d)); // pay attention to the desc order

Then, when you return, do this:
return new ArrayList<List>(hashset);