In the 4Sum problem, we have given an integer x and an array a[ ] of size n. Find all the unique set of 4 elements in array such that sum of those 4 elements is equal to the given integer x.

Table of Contents
Example
Input
a[ ] = {1, 0, -1, 0, -2, 2}
x = 0
Output
1, 0, -1, 0
1, -1, -2, 2
0, 0, -2, 2
Input
a[ ] = {1, 2, 4, 3, -3, 0, -2}
x = 7
Output
1, 2, 4, 0
2, 4, 3, -2
Naive Method
Algorithm for 4Sum
- Initialize an array a[ ] of size n and an integer x.
- Traverse four-loop with the first loop starting from 0 to n-4 and rest three inner loops starting from the value of its outer loop + 1 till n-3, n-2 and n-1 respectively.
- Check if the sum of elements at all four indexes is equal to the given integer, print all four elements.
Time Complexity: O(n4) because we are check for four values and for each value we use one loop for find its all ways of selection.
Auxiliary Space: O(1) because we don’t use any auxiliary space in the implementation part.
C++ Program to find 4Sum
#include <bits/stdc++.h>
using namespace std;
void fourSum(int a[], int n, int x){
for(int i = 0; i < n-3; i++){
for(int j = i+1; j < n-2; j++){
for(int k = j+1; k < n-1; k++){
for(int l = k+1; l < n; l++){
if(a[i] + a[j] + a[k] + a[l] == x){
cout<<a[i]<<", "<<a[j]<<", "<<a[k]<<", "<<a[l]<<endl;
}
}
}
}
}
}
int main(){
int a[] = {1, 0, -1, 0, -2, 2};
int n = sizeof(a)/sizeof(a[0]);
int x = 0;
fourSum(a, n, x);
return 0;
}1, 0, -1, 0 1, -1, -2, 2 0, 0, -2, 2
Java Program to find 4Sum
class FourElementsSum{
void fourSum(int a[], int n, int x){
for(int i = 0; i < n-3; i++){
for(int j = i+1; j < n-2; j++){
for(int k = j+1; k < n-1; k++){
for(int l = k+1; l < n; l++){
if(a[i] + a[j] + a[k] + a[l] == x){
System.out.print(a[i]+", "+a[j]+", "+a[k]+", "+a[l]);
System.out.println();
}
}
}
}
}
}
public static void main(String[] args){
FourElementsSum f = new FourElementsSum();
int a[] = {1, 0, -1, 0, -2, 2};
int n = a.length;
int x = 0;
f.fourSum(a, n, x);
}
}1, 0, -1, 0 1, -1, -2, 2 0, 0, -2, 2
Using Sorting Method
Algorithm
- Initialize an array a[ ] of size n and an integer x.
- Sort the array using quicksort.
- Set the first element by traversing from 0 to n-4 and second element by traversing from Outer loop+1 to n-3.
- Set elements 3 and 4 as j+1 and element 4 as n-1.
- Traverse while the third element is less than fourth.
- Check if sum of these four elements is equal to a given integer, print the four elements, and increment the third element and decrement the fourth element.
- Else if the sum of these four elements is less than given integer, increment the third element.
- Else decrement the fourth element.
Time Complexity: O(n3) where n denotes the number of elements present in the input array.
Auxiliary Space: O(1) because here we don’t use any auxiliary space.
C++ Program to find 4Sum
#include <bits/stdc++.h>
using namespace std;
int compare(const void *a, const void * b){
return( *(int *)a - *(int *)b );
}
void fourSum(int a[], int n, int x){
int l, r;
qsort(a, n, sizeof(a[0]), compare);
for(int i = 0; i < n-3; i++){
for(int j = i+1; j < n-2; j++){
l = j+1;
r = n-1;
while(l < r){
if(a[i] + a[j] + a[l] + a[r] == x){
cout<<a[i]<<", "<<a[j]<<", "<<a[l]<<", "<<a[r]<<endl;
l++;
r--;
}
else if(a[i] + a[j] + a[l] + a[r] < x){
l++;
}
else{
r--;
}
}
}
}
}
int main(){
int a[] = {1, 0, -1, 0, -2, 2};
int n = sizeof(a)/sizeof(a[0]);
int x = 0;
fourSum(a, n, x);
return 0;
}-2, -1, 1, 2 -2, 0, 0, 2 -1, 0, 0, 1
Java Program to find 4Sum
import java.util.Arrays;
class FourElementsSum{
void fourSum(int a[], int n, int x){
int l, r;
Arrays.sort(a);
for(int i = 0; i < n-3; i++){
for(int j = i+1; j < n-2; j++){
l = j+1;
r = n-1;
while(l < r){
if(a[i] + a[j] + a[l] + a[r] == x){
System.out.println(a[i]+", "+a[j]+", "+a[l]+", "+a[r]);
l++;
r--;
}
else if(a[i] + a[j] + a[l] + a[r] < x)
l++;
else{
r--;
}
}
}
}
}
public static void main(String[] args){
FourElementsSum f = new FourElementsSum();
int a[] = {1, 0, -1, 0, -2, 2};
int n = a.length;
int x = 0;
f.fourSum(a, n, x);
}
}-2, -1, 1, 2 -2, 0, 0, 2 -1, 0, 0, 1
More Efficient Method
Algorithm
- Initialize a vector a[ ] of size n and an integer x.
- Create a 2D vector ans to store the result and an unordered map.
- Traverse through the vector and store the sum of all combinations in map.
- Search the target-sum in map.
- Create a vector of pair type of int, int and update it as map[target-sum].
- Traverse pair vector and initialise a new vector in it..
- Store the four chosen elements in this new vector.
- Sort the new vector.
- Check if sum of these four elements is equal and elements are not common either, push the elements in 2D vector ans.
- Print the 2D vector for the result.
Time Complexity: O(n2) where n denotes the number of elements in the given vector a.
Auxiliary Space: O(n2) because here we use n2 auxiliary space in vectors and hashmaps.
C++ Program to find 4Sum
#include <bits/stdc++.h>
using namespace std;
class FourElementsSum{
public:
bool notCommon(pair<int,int> p1,pair<int,int> p2){
if(p1.first!=p1.second && p2.first!=p1.second && p2.first!=p2.second && p1.first!=p2.second && p1.first!=p2.first && p1.second!=p2.second)
return true;
return false;
}
void fourSum(vector<int>& nums, int target){
vector<vector<int>> ans;
if(nums.size()<4)
cout<<"Size is less than 4";
unordered_map<int,vector<pair<int,int>> > m;
for(int i=0; i<nums.size()-1; i++){
for(int j=i+1; j<nums.size(); j++){
m[nums[i]+nums[j]].push_back(make_pair(i,j));
}
}
for(int i=0; i<nums.size(); i++){
for(int j=i+1; j<nums.size(); j++){
int sum=nums[i]+nums[j];
if(m.find(target-sum)!=m.end()){
vector<pair<int,int>> p=m[target-sum];
for(int k=0;k<p.size();k++){
vector<int> v;
v.push_back(nums[i]);
v.push_back(nums[j]);
v.push_back(nums[m[target-sum][k].first]);
v.push_back(nums[m[target-sum][k].second]);
sort(v.begin(),v.end());
if(find(ans.begin(),ans.end(),v)==ans.end()&& notCommon(make_pair(i,j),m[target-sum][k]) )
ans.push_back(v);
}
}
}
}
for (int i = 0; i < ans.size(); i++) {
for (int j = 0; j < ans[i].size(); j++){
cout << ans[i][j] << " ";
}
cout << endl;
}
}
};
int main(){
FourElementsSum f;
vector<int> a = {1, 0, -1, 0, -2, 2};
int x = 0;
f.fourSum(a, x);
return 0;
}-1 0 0 1 -2 -1 1 2 -2 0 0 2