Split an array into two equal Sum subarrays
Last Updated :
11 Jul, 2022
Given an array of integers greater than zero, find if it is possible to split it in two subarrays (without reordering the elements), such that the sum of the two subarrays is the same. Print the two subarrays.
Examples :
Input : Arr[] = { 1 , 2 , 3 , 4 , 5 , 5 }
Output : { 1 2 3 4 }
{ 5 , 5 }
Input : Arr[] = { 4, 1, 2, 3 }
Output : {4 1}
{2 3}
Input : Arr[] = { 4, 3, 2, 1}
Output : Not Possible
Asked In : Facebook interview
A Simple solution is to run two loop to split array and check it is possible to split array into two parts such that sum of first_part equal to sum of second_part.
Below is the implementation of above idea.
C++
#include<bits/stdc++.h>
using namespace std;
int findSplitPoint( int arr[], int n)
{
int leftSum = 0 ;
for ( int i = 0; i < n; i++)
{
leftSum += arr[i] ;
int rightSum = 0 ;
for ( int j = i+1 ; j < n ; j++ )
rightSum += arr[j] ;
if (leftSum == rightSum)
return i+1 ;
}
return -1;
}
void printTwoParts( int arr[], int n)
{
int splitPoint = findSplitPoint(arr, n);
if (splitPoint == -1 || splitPoint == n )
{
cout << "Not Possible" <<endl;
return ;
}
for ( int i = 0; i < n; i++)
{
if (splitPoint == i)
cout << endl;
cout << arr[i] << " " ;
}
}
int main()
{
int arr[] = {1 , 2 , 3 , 4 , 5 , 5 };
int n = sizeof (arr)/ sizeof (arr[0]);
printTwoParts(arr, n);
return 0;
}
|
Java
import java.io.*;
class GFG {
static int findSplitPoint( int arr[], int n)
{
int leftSum = 0 ;
for ( int i = 0 ; i < n; i++)
{
leftSum += arr[i] ;
int rightSum = 0 ;
for ( int j = i+ 1 ; j < n ; j++ )
rightSum += arr[j] ;
if (leftSum == rightSum)
return i+ 1 ;
}
return - 1 ;
}
static void printTwoParts( int arr[], int n)
{
int splitPoint = findSplitPoint(arr, n);
if (splitPoint == - 1 || splitPoint == n )
{
System.out.println( "Not Possible" );
return ;
}
for ( int i = 0 ; i < n; i++)
{
if (splitPoint == i)
System.out.println();
System.out.print(arr[i] + " " );
}
}
public static void main (String[] args) {
int arr[] = { 1 , 2 , 3 , 4 , 5 , 5 };
int n = arr.length;
printTwoParts(arr, n);
}
}
|
Python3
def findSplitPoint(arr, n) :
leftSum = 0
for i in range ( 0 , n) :
leftSum + = arr[i]
rightSum = 0
for j in range (i + 1 , n) :
rightSum + = arr[j]
if (leftSum = = rightSum) :
return i + 1
return - 1
def printTwoParts(arr, n) :
splitPo = findSplitPoint(arr, n)
if (splitPo = = - 1 or splitPo = = n ) :
print ( "Not Possible" )
return
for i in range ( 0 , n) :
if (splitPo = = i) :
print ("")
print ( str (arr[i]) + ' ' ,end = '')
arr = [ 1 , 2 , 3 , 4 , 5 , 5 ]
n = len (arr)
printTwoParts(arr, n)
|
C#
using System;
class GFG {
static int findSplitPoint( int []arr, int n)
{
int leftSum = 0 ;
for ( int i = 0; i < n; i++)
{
leftSum += arr[i] ;
int rightSum = 0 ;
for ( int j = i+1 ; j < n ; j++ )
rightSum += arr[j] ;
if (leftSum == rightSum)
return i+1 ;
}
return -1;
}
static void printTwoParts( int []arr, int n)
{
int splitPoint = findSplitPoint(arr, n);
if (splitPoint == -1 || splitPoint == n )
{
Console.Write( "Not Possible" );
return ;
}
for ( int i = 0; i < n; i++)
{
if (splitPoint == i)
Console.WriteLine();
Console.Write(arr[i] + " " );
}
}
public static void Main ()
{
int []arr = {1 , 2 , 3 , 4 , 5 , 5 };
int n = arr.Length;
printTwoParts(arr, n);
}
}
|
PHP
<?php
function findSplitPoint( $arr , $n )
{
$leftSum = 0 ;
for ( $i = 0; $i < $n ; $i ++)
{
$leftSum += $arr [ $i ] ;
$rightSum = 0 ;
for ( $j = $i + 1 ; $j < $n ; $j ++ )
$rightSum += $arr [ $j ] ;
if ( $leftSum == $rightSum )
return $i +1 ;
}
return -1;
}
function printTwoParts( $arr , $n )
{
$splitPoint = findSplitPoint( $arr , $n );
if ( $splitPoint == -1 or $splitPoint == $n )
{
echo "Not Possible" ;
return ;
}
for ( $i = 0; $i < $n ; $i ++)
{
if ( $splitPoint == $i )
echo "\n" ;
echo $arr [ $i ] , " " ;
}
}
$arr = array (1 , 2 , 3 , 4 , 5 , 5);
$n = count ( $arr );
printTwoParts( $arr , $n );
?>
|
Javascript
<script>
function findSplitPoint(arr,n)
{
let leftSum = 0 ;
for (let i = 0; i < n; i++)
{
leftSum += arr[i] ;
let rightSum = 0 ;
for (let j = i+1 ; j < n ; j++ )
rightSum += arr[j] ;
if (leftSum == rightSum)
return i+1 ;
}
return -1;
}
function printTwoParts(arr,n)
{
let splitPoint = findSplitPoint(arr, n);
if (splitPoint == -1 || splitPoint == n )
{
document.write( "Not Possible" );
return ;
}
for (let i = 0; i < n; i++)
{
if (splitPoint == i)
document.write( "<br>" );
document.write(arr[i] + " " );
}
}
let arr = [1 , 2 , 3 , 4 , 5 , 5 ];
let n = arr.length;
printTwoParts(arr, n);
</script>
|
Time Complexity : O(n2)
Auxiliary Space : O(1)
An Efficient solution is to first compute the sum of the whole array from left to right. Now we traverse array from right and keep track of right sum, left sum can be computed by subtracting current element from whole sum.
Below is the implementation of above idea.
C++
#include<bits/stdc++.h>
using namespace std;
int findSplitPoint( int arr[], int n)
{
int leftSum = 0;
for ( int i = 0 ; i < n ; i++)
leftSum += arr[i];
int rightSum = 0;
for ( int i=n-1; i >= 0; i--)
{
rightSum += arr[i];
leftSum -= arr[i] ;
if (rightSum == leftSum)
return i ;
}
return -1;
}
void printTwoParts( int arr[], int n)
{
int splitPoint = findSplitPoint(arr, n);
if (splitPoint == -1 || splitPoint == n )
{
cout << "Not Possible" <<endl;
return ;
}
for ( int i = 0; i < n; i++)
{
if (splitPoint == i)
cout << endl;
cout << arr[i] << " " ;
}
}
int main()
{
int arr[] = {1 , 2 , 3 , 4 , 5 , 5 };
int n = sizeof (arr)/ sizeof (arr[0]);
printTwoParts(arr, n);
return 0;
}
|
Java
import java.io.*;
class GFG {
static int findSplitPoint( int arr[], int n)
{
int leftSum = 0 ;
for ( int i = 0 ; i < n ; i++)
leftSum += arr[i];
int rightSum = 0 ;
for ( int i = n- 1 ; i >= 0 ; i--)
{
rightSum += arr[i];
leftSum -= arr[i] ;
if (rightSum == leftSum)
return i ;
}
return - 1 ;
}
static void printTwoParts( int arr[], int n)
{
int splitPoint = findSplitPoint(arr, n);
if (splitPoint == - 1 || splitPoint == n )
{
System.out.println( "Not Possible" );
return ;
}
for ( int i = 0 ; i < n; i++)
{
if (splitPoint == i)
System.out.println();
System.out.print(arr[i] + " " );
}
}
public static void main (String[] args) {
int arr[] = { 1 , 2 , 3 , 4 , 5 , 5 };
int n = arr.length;
printTwoParts(arr, n);
}
}
|
Python3
def findSplitPoint(arr, n) :
leftSum = 0
for i in range ( 0 , n) :
leftSum + = arr[i]
rightSum = 0
for i in range (n - 1 , - 1 , - 1 ) :
rightSum + = arr[i]
leftSum - = arr[i]
if (rightSum = = leftSum) :
return i
return - 1
def printTwoParts(arr, n) :
splitPoint = findSplitPoint(arr, n)
if (splitPoint = = - 1 or splitPoint = = n ) :
print ( "Not Possible" )
return
for i in range ( 0 , n) :
if (splitPoint = = i) :
print ("")
print (arr[i], end = " " )
arr = [ 1 , 2 , 3 , 4 , 5 , 5 ]
n = len (arr)
printTwoParts(arr, n)
|
C#
using System;
class GFG {
static int findSplitPoint( int []arr, int n)
{
int leftSum = 0;
for ( int i = 0 ; i < n ; i++)
leftSum += arr[i];
int rightSum = 0;
for ( int i = n-1; i >= 0; i--)
{
rightSum += arr[i];
leftSum -= arr[i] ;
if (rightSum == leftSum)
return i ;
}
return -1;
}
static void printTwoParts( int []arr, int n)
{
int splitPoint = findSplitPoint(arr, n);
if (splitPoint == -1 || splitPoint == n )
{
Console.Write( "Not Possible" );
return ;
}
for ( int i = 0; i < n; i++)
{
if (splitPoint == i)
Console.WriteLine();
Console.Write(arr[i] + " " );
}
}
public static void Main (String[] args) {
int []arr = {1 , 2 , 3 , 4 , 5 , 5 };
int n = arr.Length;
printTwoParts(arr, n);
}
}
|
PHP
<?php
function findSplitPoint( $arr , $n )
{
$leftSum = 0;
for ( $i = 0 ; $i < $n ; $i ++)
$leftSum += $arr [ $i ];
$rightSum = 0;
for ( $i = $n - 1; $i >= 0; $i --)
{
$rightSum += $arr [ $i ];
$leftSum -= $arr [ $i ] ;
if ( $rightSum == $leftSum )
return $i ;
}
return -1;
}
function printTwoParts( $arr , $n )
{
$splitPoint = findSplitPoint( $arr , $n );
if ( $splitPoint == -1 or
$splitPoint == $n )
{
echo "Not Possible" ;
return ;
}
for ( $i = 0; $i < $n ; $i ++)
{
if ( $splitPoint == $i )
echo "\n" ;
echo $arr [ $i ] , " " ;
}
}
$arr = array (1, 2, 3, 4, 5, 5);
$n = count ( $arr );
printTwoParts( $arr , $n );
?>
|
Javascript
<script>
function findSplitPoint(arr, n)
{
let leftSum = 0;
for (let i = 0 ; i < n ; i++)
leftSum += arr[i];
let rightSum = 0;
for (let i = n-1; i >= 0; i--)
{
rightSum += arr[i];
leftSum -= arr[i] ;
if (rightSum == leftSum)
return i ;
}
return -1;
}
function printTwoParts(arr, n)
{
let splitPoint = findSplitPoint(arr, n);
if (splitPoint == -1 || splitPoint == n )
{
document.write( "Not Possible" );
return ;
}
for (let i = 0; i < n; i++)
{
if (splitPoint == i)
document.write( "</br>" );
document.write(arr[i] + " " );
}
}
let arr = [1 , 2 , 3 , 4 , 5 , 5 ];
let n = arr.length;
printTwoParts(arr, n);
</script>
|
Time Complexity : O(n)
Auxiliary Space : O(1)
Related Topic: Subarrays, Subsequences, and Subsets in Array
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...