# 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 
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
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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

 `// C++ program to divide the array into two ` `// subarrays with the same sum on removing ` `// exactly one integer from the array ` `#include ` `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); ` ` `  `    ``divideArray(arr, n); ` ` `  `    ``return` `0; ` `} `

## Java

 `// 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 `

## Python3

 `''' 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 `

## C#

 `// 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. `

## PHP

 ` `

Output:

```The array can be divided into two subarrays with equal sum
The two sets are -  [3 2 1]
```

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up

Improved By : vt_m, nidhi_biet

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.