Open In App

Find four elements that sum to a given value (4Sum) | Set 1 (n^3 solution)

Last Updated : 11 Sep, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Given an array of integers, find all combination of four elements in the array whose sum is equal to a given value X. 

Example:

Input: array = {10, 2, 3, 4, 5, 9, 7, 8}, X = 23
Output: 3 5 7 8
Explanation: Sum of output is equal to 23, i.e. 3 + 5 + 7 + 8 = 23.

Input: array = {1, 2, 3, 4, 5, 9, 7, 8}, X = 16
Output: 1 3 5 7
Explanation: Sum of output is equal to 16, i.e. 1 + 3 + 5 + 7 = 16.

Recommended Practice

4Sum using Four Nested loop

A Naive Solution is to generate all possible quadruples and compare the sum of every quadruple with X. The following code implements this simple method using four nested loops 

C++




// C++ program for naive solution to
// print all combination of 4 elements
// in A[] with sum equal to X
#include <bits/stdc++.h>
using namespace std;
 
/* A naive solution to print all combination
of 4 elements in A[]with sum equal to X */
void findFourElements(int A[], int n, int X)
{
     
// Fix the first element and find other three
for (int i = 0; i < n - 3; i++)
{
    // Fix the second element and find other two
    for (int j = i + 1; j < n - 2; j++)
    {
         
        // Fix the third element and find the fourth
        for (int k = j + 1; k < n - 1; k++)
        {
            // find the fourth
            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];
        }
    }
}
}
 
// Driver Code
int main()
{
    int A[] = {10, 20, 30, 40, 1, 2};
    int n = sizeof(A) / sizeof(A[0]);
    int X = 91;
    findFourElements (A, n, X);
    return 0;
}
 
// This code is contributed
// by Akanksha Rai


C




// C implementation of above approach
 
#include <stdio.h>
 
/* A naive solution to print all combination of 4 elements in A[]
  with sum equal to X */
void findFourElements(int A[], int n, int X)
{
  // Fix the first element and find other three
  for (int i = 0; i < n-3; i++)
  {
    // Fix the second element and find other two
    for (int j = i+1; j < n-2; j++)
    {
      // Fix the third element and find the fourth
      for (int k = j+1; k < n-1; k++)
      {
        // find the fourth
        for (int l = k+1; l < n; l++)
           if (A[i] + A[j] + A[k] + A[l] == X)
              printf("%d, %d, %d, %d", A[i], A[j], A[k], A[l]);
      }
    }
  }
}
 
// Driver program to test above function
int main()
{
    int A[] = {10, 20, 30, 40, 1, 2};
    int n = sizeof(A) / sizeof(A[0]);
    int X = 91;
    findFourElements (A, n, X);
    return 0;
}


Java




// Java implementation of above approach
 
class FindFourElements
{
 
    /* A naive solution to print all combination of 4 elements in A[]
       with sum equal to X */
    void findFourElements(int A[], int n, int X)
    {
        // Fix the first element and find other three
        for (int i = 0; i < n - 3; i++)
        {
            // Fix the second element and find other two
            for (int j = i + 1; j < n - 2; j++)
            {
                // Fix the third element and find the fourth
                for (int k = j + 1; k < n - 1; k++)
                {
                    // find the fourth
                    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]);
                    }
                }
            }
        }
    }
 
    // Driver program to test above functions
    public static void main(String[] args)
    {
        FindFourElements findfour = new FindFourElements();
        int A[] = {10, 20, 30, 40, 1, 2};
        int n = A.length;
        int X = 91;
        findfour.findFourElements(A, n, X);
    }
}


Python3




#Python 3 implementation of above approach
 
# A naive solution to print all combination
# of 4 elements in A[] with sum equal to X
def findFourElements(A, n, X):
     
    # Fix the first element and find
    # other three
    for i in range(0,n-3):
         
        # Fix the second element and
        # find other two
        for j in range(i+1,n-2):
             
            # Fix the third element
            # and find the fourth
            for k in range(j+1,n-1):
                 
                # find the fourth
                for l in range(k+1,n):
                     
                    if A[i] + A[j] + A[k] + A[l] == X:
                        print ("%d, %d, %d, %d"
                        %( A[i], A[j], A[k], A[l]))
 
# Driver program to test above function
A = [10, 2, 3, 4, 5, 9, 7, 8]
n = len(A)
X = 23
findFourElements (A, n, X)
 
# This code is contributed by shreyanshi_arun


C#




// C# program for naive solution to
// print all combination of 4 elements
// in A[] with sum equal to X
using System;
 
class FindFourElements
{
    void findFourElements(int []A, int n, int X)
    {
        // Fix the first element and find other three
        for (int i = 0; i < n - 3; i++)
        {
            // Fix the second element and find other two
            for (int j = i + 1; j < n - 2; j++)
            {
                // Fix the third element and find the fourth
                for (int k = j + 1; k < n - 1; k++)
                {
                    // find the fourth
                    for (int l = k + 1; l < n; l++)
                    {
                        if (A[i] + A[j] + A[k] + A[l] == X)
                        Console.Write(A[i] + " " + A[j] +
                                " " + A[k] + " " + A[l]);
                    }
                }
            }
        }
    }
 
    // Driver program to test above functions
    public static void Main()
    {
        FindFourElements findfour = new FindFourElements();
        int []A = {10, 20, 30, 40, 1, 2};
        int n = A.Length;
        int X = 91;
        findfour.findFourElements(A, n, X);
    }
}
 
// This code is contributed by nitin mittal


Javascript




<script>
 
// Javascript program for the above approach
 
/* A naive solution to print all combination
of 4 elements in A[]with sum equal to X */
function findFourElements(A, n, X)
{
     
// Fix the first element and find other three
for (let i = 0; i < n - 3; i++)
{
    // Fix the second element and find other two
    for (let j = i + 1; j < n - 2; j++)
    {
         
        // Fix the third element and find the fourth
        for (let k = j + 1; k < n - 1; k++)
        {
            // find the fourth
            for (let l = k + 1; l < n; l++)
            if (A[i] + A[j] + A[k] + A[l] == X)
                document.write(A[i]+", "+A[j]+", "+A[k] +", "+A[l]);
        }
    }
}
}
 
// Driver Code
 
    let A = [10, 20, 30, 40, 1, 2];
    let n = A.length;
    let X = 91;
    findFourElements (A, n, X);
 
</script>


PHP




<?php
  // Php implementation of above approach
 
/* A naive solution to print all combination
of 4 elements in A[] with sum equal to X */
 
function findFourElements($A, $n, $X)
{
    // Fix the first element and find other
    // three
    for ($i = 0; $i < $n-3; $i++)
    {
        // Fix the second element and find
        // other two
        for ($j = $i+1; $j < $n-2; $j++)
        {
            // Fix the third element and
            // find the fourth
            for ($k = $j+1; $k < $n-1; $k++)
            {
                // find the fourth
                for ($l = $k+1; $l < $n; $l++)
                    if ($A[$i] + $A[$j] +
                        $A[$k] + $A[$l] == $X)
                         
                        echo $A[$i], ", " , $A[$j],
                        ", ", $A[$k], ", ", $A[$l];
            }
        }
    }
}
 
// Driver program to test above function
    $A = array (10, 20, 30, 40, 1, 2);
    $n = sizeof($A) ;
    $X = 91;
    findFourElements ($A, $n, $X);
     
// This code is contributed by m_kit
?>


Output

20, 30, 40, 1

Time Complexity: O(n^4)
Auxiliary Space: O(1)

4Sum using Sorting

The time complexity can be improved to O(n^3) with the use of sorting as a preprocessing step, and then using method 1 of this post to reduce a loop.

  • Sort the input array. 
  • Fix the first element as A[i] where i is from 0 to n–3. After fixing the first element of quadruple, fix the second element as A[j] where j varies from i+1 to n-2. Find remaining two elements in O(n) time, using the method 1 of this post 

Below is the implementation of the above approach:

C++




// C++ program for to  print all combination
// of 4 elements in A[] with sum equal to X
#include <bits/stdc++.h>
using namespace std;
 
/* Following function is needed
for library function qsort(). */
int compare(const void* a, const void* b)
{
    return (*(int*)a - *(int*)b);
}
 
/* A sorting based solution to print
all combination of 4 elements in A[]
with sum equal to X */
void find4Numbers(int A[], int n, int X)
{
    int l, r;
 
    // Sort the array in increasing
    // order, using library function
    // for quick sort
    qsort(A, n, sizeof(A[0]), compare);
 
    /* Now fix the first 2 elements
    one by one and find
    the other two elements */
    for (int i = 0; i < n - 3; i++) {
        for (int j = i + 1; j < n - 2; j++) {
            // Initialize two variables as
            // indexes of the first and last
            // elements in the remaining elements
            l = j + 1;
            r = n - 1;
 
            // To find the remaining two
            // elements, move the index
            // variables (l & r) toward each other.
            while (l < r) {
                if (A[i] + A[j] + A[l] + A[r] == X) {
                    cout << A[i] << ", " << A[j] << ", "
                         << A[l] << ", " << A[r];
                    l++;
                    r--;
                }
                else if (A[i] + A[j] + A[l] + A[r] < X)
                    l++;
                else // A[i] + A[j] + A[l] + A[r] > X
                    r--;
            } // end of while
        } // end of inner for loop
    } // end of outer for loop
}
 
/* Driver code */
int main()
{
    int A[] = { 1, 4, 45, 6, 10, 12 };
    int X = 21;
    int n = sizeof(A) / sizeof(A[0]);
    find4Numbers(A, n, X);
    return 0;
}
 
// This code is contributed by rathbhupendra


C




# include <stdio.h>
# include <stdlib.h>
 
/* Following function is needed for library function qsort(). Refer
int compare (const void *a, const void * b)
return ( *(int *)a - *(int *)b ); }
 
/* A sorting based solution to print all combination of 4 elements in A[]
   with sum equal to X */
void find4Numbers(int A[], int n, int X)
{
    int l, r;
 
    // Sort the array in increasing order, using library
    // function for quick sort
    qsort (A, n, sizeof(A[0]), compare);
 
    /* Now fix the first 2 elements one by one and find
       the other two elements */
    for (int i = 0; i < n - 3; i++)
    {
        for (int j = i+1; j < n - 2; j++)
        {
            // Initialize two variables as indexes of the first and last
            // elements in the remaining elements
            l = j + 1;
            r = n-1;
 
            // To find the remaining two elements, move the index
            // variables (l & r) toward each other.
            while (l < r)
            {
                if( A[i] + A[j] + A[l] + A[r] == X)
                {
                   printf("%d, %d, %d, %d", A[i], A[j],
                                           A[l], A[r]);
                   l++; r--;
                }
                else if (A[i] + A[j] + A[l] + A[r] < X)
                    l++;
                else // A[i] + A[j] + A[l] + A[r] > X
                    r--;
            } // end of while
        } // end of inner for loop
    } // end of outer for loop
}
 
/* Driver program to test above function */
int main()
{
    int A[] = {1, 4, 45, 6, 10, 12};
    int X = 21;
    int n = sizeof(A)/sizeof(A[0]);
    find4Numbers(A, n, X);
    return 0;
}


Java




import java.util.Arrays;
 
 
class FindFourElements
{
    /* A sorting based solution to print all combination of 4 elements in A[]
       with sum equal to X */
    void find4Numbers(int A[], int n, int X)
    {
        int l, r;
 
        // Sort the array in increasing order, using library
        // function for quick sort
        Arrays.sort(A);
 
        /* Now fix the first 2 elements one by one and find
           the other two elements */
        for (int i = 0; i < n - 3; i++)
        {
            for (int j = i + 1; j < n - 2; j++)
            {
                // Initialize two variables as indexes of the first and last
                // elements in the remaining elements
                l = j + 1;
                r = n - 1;
 
                // To find the remaining two elements, move the index
                // variables (l & r) toward each other.
                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 // A[i] + A[j] + A[l] + A[r] > X
                        r--;
                } // end of while
            } // end of inner for loop
        } // end of outer for loop
    }
 
    // Driver program to test above functions
    public static void main(String[] args)
    {
        FindFourElements findfour = new FindFourElements();
        int A[] = {1, 4, 45, 6, 10, 12};
        int n = A.length;
        int X = 21;
        findfour.find4Numbers(A, n, X);
    }
}
 
// This code has been contributed by Mayank Jaiswal


Python 3




# A sorting based solution to print all combination
# of 4 elements in A[] with sum equal to X
def find4Numbers(A, n, X):
 
    # Sort the array in increasing order,
    # using library function for quick sort
    A.sort()
 
    # Now fix the first 2 elements one by
    # one and find the other two elements
    for i in range(n - 3):
        for j in range(i + 1, n - 2):
             
            # Initialize two variables as indexes
            # of the first and last elements in
            # the remaining elements
            l = j + 1
            r = n - 1
 
            # To find the remaining two elements,
            # move the index variables (l & r)
            # toward each other.
            while (l < r):
                if(A[i] + A[j] + A[l] + A[r] == X):
                    print(A[i], ",", A[j], ",",
                          A[l], ",", A[r])
                    l += 1
                    r -= 1
                 
                elif (A[i] + A[j] + A[l] + A[r] < X):
                    l += 1
                else: # A[i] + A[j] + A[l] + A[r] > X
                    r -= 1
 
# Driver Code
if __name__ == "__main__":
     
    A = [1, 4, 45, 6, 10, 12]
    X = 21
    n = len(A)
    find4Numbers(A, n, X)
 
# This code is contributed by ita_c


C#




// C# program for to  print all combination
// of 4 elements in A[] with sum equal to X
using System;
 
class FindFourElements
{
    // A sorting based solution to print all
    // combination of 4 elements in A[] with
    // sum equal to X
    void find4Numbers(int []A, int n, int X)
    {
        int l, r;
 
        // Sort the array in increasing order,
        // using library function for quick sort
        Array.Sort(A);
 
        /* Now fix the first 2 elements one by one
           and find the other two elements */
        for (int i = 0; i < n - 3; i++)
        {
            for (int j = i + 1; j < n - 2; j++)
            {
                // Initialize two variables as indexes of
                // the first and last elements in the
                // remaining elements
                l = j + 1;
                r = n - 1;
 
                // To find the remaining two elements, move the
                // index variables (l & r) toward each other.
                while (l < r)
                {
                    if (A[i] + A[j] + A[l] + A[r] == X)
                    {
                        Console.Write(A[i] + " " + A[j] +
                                " " + A[l] + " " + A[r]);
                        l++;
                        r--;
                    }
                    else if (A[i] + A[j] + A[l] + A[r] < X)
                        l++;
                         
                    else // A[i] + A[j] + A[l] + A[r] > X
                        r--;
                         
                } // end of while
                 
            } // end of inner for loop
             
        } // end of outer for loop
    }
 
    // Driver program to test above functions
    public static void Main()
    {
        FindFourElements findfour = new FindFourElements();
        int []A = {1, 4, 45, 6, 10, 12};
        int n = A.Length;
        int X = 21;
        findfour.find4Numbers(A, n, X);
    }
}
 
// This code has been contributed by nitin mittal


Javascript




<script>
     
    /* A sorting based solution to print all combination of 4 elements in A[]
       with sum equal to X */
    function find4Numbers(A,n,X)
    {
         
        let l, r;
        // Sort the array in increasing order, using library
        // function for quick sort
        A.sort(function(a, b){return a - b});
         
        /* Now fix the first 2 elements one by one and find
           the other two elements */
        for (let i = 0; i < n - 3; i++)
        {
            for (let j = i + 1; j < n - 2; j++)
            {
                // Initialize two variables as indexes of the first and last
                // elements in the remaining elements
                l = j + 1;
                r = n - 1;
  
                // To find the remaining two elements, move the index
                // variables (l & r) toward each other.
                while (l < r)
                {
                    if (A[i] + A[j] + A[l] + A[r] == X)
                    {
                        document.write(A[i]+" "+A[j]+" "+A[l]+" "+A[r]+"<br>");
                        l++;
                        r--;
                    }
                    else if ((A[i] + A[j] + A[l] + A[r]) < X)
                    {   
                        l++;
                    }
                    else // A[i] + A[j] + A[l] + A[r] > X
                    {
                        r--;
                    }
                } // end of while
            }    // end of inner for loop
        }// end of outer for loop
    }
     
    // Driver program to test above functions
    let A= [1, 4, 45, 6, 10, 12];
    let n = A.length;
    let X = 21;
     
    find4Numbers(A, n, X)
     
    // This code is contributed by rag2127
     
</script>


PHP




<?php
// PHP program for to print all
// combination of 4 elements in
// A[] with sum equal to X
 
// A sorting based solution to
// print all combination of 4
// elements in A[] with sum
// equal to X
function find4Numbers($A, $n, $X)
{
    $l; $r;
 
    // Sort the array in increasing
    // order, using library function
    // for quick sort
    sort($A);
 
    // Now fix the first 2 elements
    // one by one and find the other
    // two elements
    for ($i = 0; $i < $n - 3; $i++)
    {
        for ($j = $i + 1; $j < $n - 2; $j++)
        {
            // Initialize two variables
            // as indexes of the first
            // and last elements in the
            // remaining elements
            $l = $j + 1;
            $r = $n - 1;
 
            // To find the remaining two
            // elements, move the index
            // variables (l & r) towards
            // each other.
            while ($l < $r)
            {
                if ($A[$i] + $A[$j] +
                    $A[$l] + $A[$r] == $X)
                {
                    echo $A[$i] , " " , $A[$j] ,
                                  " " , $A[$l] ,
                                  " " , $A[$r];
                    $l++;
                    $r--;
                }
                else if ($A[$i] + $A[$j] +
                         $A[$l] + $A[$r] < $X)
                    $l++;
                     
                // A[i] + A[j] + A[l] + A[r] > X
                else
                    $r--;
                     
            }
        }
    }
}
 
// Driver Code
$A = array(1, 4, 45, 6, 10, 12);
$n = count($A);
$X = 21;
find4Numbers($A, $n, $X);
 
// This code is contributed
// by nitin mittal
?>


Output

1, 4, 6, 10

Time Complexity : O(n^3)
Auxiliary Space: O(1)

This problem can also be solved in O(n^2Logn) complexity. Please refer below post for details
Find four elements that sum to a given value | Set 2 ( O(n^2Logn) Solution)



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads