Find if array can be divided into two subarrays of equal sum

04 Jul, 2022
Given an array of integers, find if it’s possible to remove exactly one integer from the array that divides the array into two subarrays with the same sum.
Examples: 
Input:  arr = [6, 2, 3, 2, 1]
Output:  true
Explanation:  On removing element 2 at index 1,
the array gets divided into two subarrays [6]
 and [3, 2, 1] having equal sum

Input:  arr = [6, 1, 3, 2, 5]
Output:  true
Explanation:  On removing element 3 at index 2,
the array gets divided into two subarrays [6, 1]
and [2, 5] having equal sum.

Input:  arr = [6, -2, -3, 2, 3]
Output: true
Explanation:  On removing element 6 at index 0, 
the array gets divided into two sets [] 
and [-2, -3, 2, 3] having equal sum

Input:  arr = [6, -2, 3, 2, 3]
Output: false
A naive solution would be to consider all elements of the array and calculate their left and right sum and return true if left and right sum are found to be equal. The time complexity of this solution would be O(n2).
The efficient solution involves calculating sum of all elements of the array in advance. Then for each element of the array, we can calculate its right sum in O(1) time by using total sum of the array elements minus sum of elements found so far. The time complexity of this solution would be O(n) and auxiliary space used by it will be O(1).
Below is the implementation of above approach:
C++
Java
Python3
C#
PHP
Javascript
// C++ program to divide the array into two// subarrays with the same sum on removing// exactly one integer from the array#include <iostream>using namespace std; // Utility function to print the sub-arrayvoid printSubArray(int arr[], int start, int end){    cout << "[ ";    for (int i = start; i <= end; i++)        cout << arr[i] << " ";    cout << "] ";} // Function that divides the array into two subarrays// with the same sumbool divideArray(int arr[], int n){    // sum stores sum of all elements of the array    int sum = 0;    for (int i = 0; i < n; i++)        sum += arr[i];     // sum stores sum till previous index of the array    int sum_so_far = 0;     for (int i = 0; i < n; i++)    {        // If on removing arr[i], we get equals left        // and right half        if (2 * sum_so_far + arr[i] == sum)        {            cout << "The array can be divided into"                    "two subarrays with equal sum\nThe"                    " two subarrays are - ";            printSubArray(arr, 0, i - 1);            printSubArray(arr, i + 1, n - 1);             return true;        }        // add current element to sum_so_far        sum_so_far += arr[i];    }     // The array cannot be divided    cout << "The array cannot be divided into two "         "subarrays with equal sum";     return false;} // Driver codeint main(){    int arr[] = {6, 2, 3, 2, 1};    int n = sizeof(arr)/sizeof(arr[0]);     divideArray(arr, n);     return 0;}
// Java program to divide the array into two// subarrays with the same sum on removing// exactly one integer from the arrayimport java.io.*; class GFG{    // Utility function to print the sub-array    static void printSubArray(int arr[], int start, int end)    {        System.out.print("[ ");        for (int i = start; i <= end; i++)            System.out.print(arr[i] +" ");        System.out.print("] ");    }         // Function that divides the array into two subarrays    // with the same sum    static boolean divideArray(int arr[], int n)    {        // sum stores sum of all elements of the array        int sum = 0;        for (int i = 0; i < n; i++)            sum += arr[i];          // sum stores sum till previous index of the array        int sum_so_far = 0;          for (int i = 0; i < n; i++)        {            // If on removing arr[i], we get equals left            // and right half            if (2 * sum_so_far + arr[i] == sum)            {                System.out.print("The array can be divided into "                    +"two subarrays with equal sum\nThe"                    +" two subarrays are - ");                printSubArray(arr, 0, i - 1);                printSubArray(arr, i + 1, n - 1);                  return true;            }            // add current element to sum_so_far            sum_so_far += arr[i];        }          // The array cannot be divided        System.out.println("The array cannot be divided into two "                +"subarrays with equal sum");                         return false;    }         // Driver program    public static void main (String[] args)    {        int arr[] = {6, 2, 3, 2, 1};        int n = arr.length;          divideArray(arr, n);    }} // This code is contributed by Pramod Kumar
''' Python3 program to divide the arrayinto two subarrays with the same sum onremoving exactly one integer from the array''' # Utility function to print the sub-arraydef printSubArray(arr, start, end):    print ("[ ", end = "")    for i in range(start, end+1):        print (arr[i], end =" ")    print ("]", end ="") # Function that divides the array into# two subarrays with the same sumdef divideArray(arr, n):     # sum stores sum of all    # elements of the array    sum = 0    for i in range(0, n):        sum += arr[i]     # sum stores sum till previous    # index of the array    sum_so_far = 0    for i in range(0, n):         # If on removing arr[i], we get        # equals left and right half        if 2 * sum_so_far + arr[i] == sum:            print ("The array can be divided into",                    "two subarrays with equal sum")            print ("two subarrays are -", end = "")            printSubArray(arr, 0, i - 1)            printSubArray(arr, i + 1, n - 1)            return True         # add current element to sum_so_far        sum_so_far += arr[i]     # The array cannot be divided    print ("The array cannot be divided into"           "two subarrays with equal sum", end = "")     return False # Driver codearr = [6, 2, 3, 2, 1]n = len(arr)divideArray(arr, n) # This code is contributed by Shreyanshi Arun
// C# program to divide the array into two// subarrays with the same sum on removing// exactly one integer from the arrayusing System; class GFG {         // Utility function to print the sub-array    static void printSubArray(int []arr,                           int start, int end)    {        Console.Write("[ ");        for (int i = start; i <= end; i++)            Console.Write(arr[i] +" ");        Console.Write("] ");    }         // Function that divides the array into    // two subarrays with the same sum    static bool divideArray(int []arr, int n)    {                 // sum stores sum of all elements of        // the array        int sum = 0;        for (int i = 0; i < n; i++)            sum += arr[i];         // sum stores sum till previous index        // of the array        int sum_so_far = 0;         for (int i = 0; i < n; i++)        {                         // If on removing arr[i], we get            // equals left and right half            if (2 * sum_so_far + arr[i] == sum)            {                Console.Write("The array can be"                 + " divided into two subarrays"                 + " with equal sum\nThe two"                 + " subarrays are - ");                printSubArray(arr, 0, i - 1);                printSubArray(arr, i + 1, n - 1);                 return true;            }            // add current element to sum_so_far            sum_so_far += arr[i];        }         // The array cannot be divided        Console.WriteLine("The array cannot be"          + " divided into two subarrays with "                                + "equal sum");                         return false;    }         // Driver program    public static void Main ()    {        int []arr = {6, 2, 3, 2, 1};        int n = arr.Length;         divideArray(arr, n);    }} // This code is contributed by anuj_67.
<?php// PHP program to divide the array into two// subarrays with the same sum on removing// exactly one integer from the array // Utility function to print the sub-arrayfunction printSubArray($arr, $start, $end){    echo "[ ";    for ($i = $start; $i <= $end; $i++)        echo $arr[$i] . " ";    echo "] ";} // Function that divides the// array into two subarrays// with the same sumfunction divideArray($arr, $n){         // sum stores sum of all    // elements of the array    $sum = 0;    for ($i = 0; $i < $n; $i++)        $sum += $arr[$i];     // sum stores sum till previous    // index of the array    $sum_so_far = 0;     for ($i = 0; $i < $n; $i++)    {                 // If on removing arr[i],        // we get equals left        // and right half        if (2 * $sum_so_far + $arr[$i] == $sum)        {            echo "The array can be divided into" .                 "two subarrays with equal sum\nThe".                 " two subarrays are - ";            printSubArray($arr, 0, $i - 1);            printSubArray($arr, $i + 1, $n - 1);             return true;        }                 // add current element        // to sum_so_far        $sum_so_far += $arr[$i];    }     // The array cannot be divided    echo "The array cannot be divided into two ".         "subarrays with equal sum";     return false;}     // Driver code    $arr = array(6, 2, 3, 2, 1);    $n = sizeof($arr);     divideArray($arr, $n);     // This code is contributed by Anuj_67?>
<script>     // JavaScript program to divide the array into two    // subarrays with the same sum on removing    // exactly one integer from the array         // Utility function to print the sub-array    function printSubArray(arr, start, end)    {        document.write("[ ");        for (let i = start; i <= end; i++)            document.write(arr[i] +" ");        document.write("] ");    }           // Function that divides the array into    // two subarrays with the same sum    function divideArray(arr, n)    {                   // sum stores sum of all elements of        // the array        let sum = 0;        for (let i = 0; i < n; i++)            sum += arr[i];           // sum stores sum till previous index        // of the array        let sum_so_far = 0;           for (let i = 0; i < n; i++)        {                           // If on removing arr[i], we get            // equals left and right half            if (2 * sum_so_far + arr[i] == sum)            {                document.write("The array can be"                 + " divided into two subarrays"                 + " with equal sum " + "</br>" + "The two"                 + " sets are - ");                printSubArray(arr, 0, i - 1);                printSubArray(arr, i + 1, n - 1);                   return true;            }            // add current element to sum_so_far            sum_so_far += arr[i];        }           // The array cannot be divided        document.write("The array cannot be"          + " divided into two subarrays with "                                + "equal sum" + "</br>");                           return false;    }         let arr = [6, 2, 3, 2, 1];    let n = arr.length;     divideArray(arr, n);     </script>
The array can be divided intotwo subarrays with equal sum
The two subarrays are - [ 6 ] [ 3 2 1 ] 
This article is contributed by Aditya Goel. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
vt_m
nidhi_biet
rameshtravel07
simranarora5sos
hardikkoriintern
subarray
subarray-sum
Arrays
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Multidimensional Arrays in Java
Stack Data Structure (Introduction and Program)
Linear Search
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Introduction to Arrays
K'th Smallest/Largest Element in Unsorted Array | Set 1
Introduction to Data Structures
Python | Using 2D arrays/lists the right way