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

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
  
// Uitlity function to print the sub-array
void 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 sum
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)
        {
            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 code
int main()
{
    int arr[] = {6, 2, 3, 2, 1};
    int n = sizeof(arr)/sizeof(arr[0]);
  
    divideArray(arr, n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to divide the array into two
// subarrays with the same sum on removing
// exactly one integer from the array
import java.io.*;
  
class GFG 
{
    // Uitlity 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

''' Python3 program to divide the array 
into two subarrays with the same sum on 
removing exactly one integer from the array'''
  
# Uitlity function to print the sub-array
def 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 sum
def 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 code
arr = [6, 2, 3, 2, 1]
n = len(arr)
divideArray(arr, n)
  
# This code is contributed by Shreyanshi Arun

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to divide the array into two
// subarrays with the same sum on removing
// exactly one integer from the array
using System;
  
class GFG {
      
    // Uitlity 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.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to divide the array into two
// subarrays with the same sum on removing
// exactly one integer from the array
  
// Uitlity function to prthe sub-array
function 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 sum
function 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
?>

chevron_right



Output:

The array can be divided into two subarrays with equal sum
The two sets 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 contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up

Improved By : vt_m



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.