Find if array can be divided into two subarrays of equal sum
Last Updated :
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++
#include <iostream>
using namespace std;
void printSubArray( int arr[], int start, int end)
{
cout << "[ " ;
for ( int i = start; i <= end; i++)
cout << arr[i] << " " ;
cout << "] " ;
}
bool divideArray( int arr[], int n)
{
int sum = 0;
for ( int i = 0; i < n; i++)
sum += arr[i];
int sum_so_far = 0;
for ( int i = 0; i < n; i++)
{
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 ;
}
sum_so_far += arr[i];
}
cout << "The array cannot be divided into two "
"subarrays with equal sum" ;
return false ;
}
int main()
{
int arr[] = {6, 2, 3, 2, 1};
int n = sizeof (arr)/ sizeof (arr[0]);
divideArray(arr, n);
return 0;
}
|
Java
import java.io.*;
class GFG
{
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( "] " );
}
static boolean divideArray( int arr[], int n)
{
int sum = 0 ;
for ( int i = 0 ; i < n; i++)
sum += arr[i];
int sum_so_far = 0 ;
for ( int i = 0 ; i < n; i++)
{
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 ;
}
sum_so_far += arr[i];
}
System.out.println( "The array cannot be divided into two "
+ "subarrays with equal sum" );
return false ;
}
public static void main (String[] args)
{
int arr[] = { 6 , 2 , 3 , 2 , 1 };
int n = arr.length;
divideArray(arr, n);
}
}
|
Python3
def printSubArray(arr, start, end):
print ( "[ " , end = "")
for i in range (start, end + 1 ):
print (arr[i], end = " " )
print ( "]" , end = "")
def divideArray(arr, n):
sum = 0
for i in range ( 0 , n):
sum + = arr[i]
sum_so_far = 0
for i in range ( 0 , n):
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
sum_so_far + = arr[i]
print ( "The array cannot be divided into"
"two subarrays with equal sum" , end = "")
return False
arr = [ 6 , 2 , 3 , 2 , 1 ]
n = len (arr)
divideArray(arr, n)
|
C#
using System;
class GFG {
static void printSubArray( int []arr,
int start, int end)
{
Console.Write( "[ " );
for ( int i = start; i <= end; i++)
Console.Write(arr[i] + " " );
Console.Write( "] " );
}
static bool divideArray( int []arr, int n)
{
int sum = 0;
for ( int i = 0; i < n; i++)
sum += arr[i];
int sum_so_far = 0;
for ( int i = 0; i < n; i++)
{
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 ;
}
sum_so_far += arr[i];
}
Console.WriteLine( "The array cannot be"
+ " divided into two subarrays with "
+ "equal sum" );
return false ;
}
public static void Main ()
{
int []arr = {6, 2, 3, 2, 1};
int n = arr.Length;
divideArray(arr, n);
}
}
|
PHP
<?php
function printSubArray( $arr , $start , $end )
{
echo "[ " ;
for ( $i = $start ; $i <= $end ; $i ++)
echo $arr [ $i ] . " " ;
echo "] " ;
}
function divideArray( $arr , $n )
{
$sum = 0;
for ( $i = 0; $i < $n ; $i ++)
$sum += $arr [ $i ];
$sum_so_far = 0;
for ( $i = 0; $i < $n ; $i ++)
{
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;
}
$sum_so_far += $arr [ $i ];
}
echo "The array cannot be divided into two " .
"subarrays with equal sum" ;
return false;
}
$arr = array (6, 2, 3, 2, 1);
$n = sizeof( $arr );
divideArray( $arr , $n );
?>
|
Javascript
<script>
function printSubArray(arr, start, end)
{
document.write( "[ " );
for (let i = start; i <= end; i++)
document.write(arr[i] + " " );
document.write( "] " );
}
function divideArray(arr, n)
{
let sum = 0;
for (let i = 0; i < n; i++)
sum += arr[i];
let sum_so_far = 0;
for (let i = 0; i < n; i++)
{
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 ;
}
sum_so_far += arr[i];
}
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>
|
Output
The array can be divided intotwo subarrays with equal sum
The two subarrays are - [ 6 ] [ 3 2 1 ]
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...