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++
// C++ program to split an array into Two
// equal sum subarrays
#include<bits/stdc++.h>
using namespace std;
// Returns split point. If not possible, then
// return -1.
int findSplitPoint(int arr[], int n)
{
int leftSum = 0 ;
// traverse array element
for (int i = 0; i < n; i++)
{
// add current element to left Sum
leftSum += arr[i] ;
// find sum of rest array elements (rightSum)
int rightSum = 0 ;
for (int j = i+1 ; j < n ; j++ )
rightSum += arr[j] ;
// split point index
if (leftSum == rightSum)
return i+1 ;
}
// if it is not possible to split array into
// two parts
return -1;
}
// Prints two parts after finding split point using
// findSplitPoint()
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] << " " ;
}
}
// driver program
int main()
{
int arr[] = {1 , 2 , 3 , 4 , 5 , 5 };
int n = sizeof(arr)/sizeof(arr[0]);
printTwoParts(arr, n);
return 0;
}
Java
// Java program to split an array
// into two equal sum subarrays
import java.io.*;
class GFG {
// Returns split point. If
// not possible, then return -1.
static int findSplitPoint(int arr[], int n)
{
int leftSum = 0 ;
// traverse array element
for (int i = 0; i < n; i++)
{
// add current element to left Sum
leftSum += arr[i] ;
// find sum of rest array
// elements (rightSum)
int rightSum = 0 ;
for (int j = i+1 ; j < n ; j++ )
rightSum += arr[j] ;
// split point index
if (leftSum == rightSum)
return i+1 ;
}
// if it is not possible to
// split array into two parts
return -1;
}
// Prints two parts after finding
// split point using findSplitPoint()
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] + " ");
}
}
// Driver program
public static void main (String[] args) {
int arr[] = {1 , 2 , 3 , 4 , 5 , 5 };
int n = arr.length;
printTwoParts(arr, n);
}
}
// This code is contributed by vt_m
Python3
# Python3 program to split an array into Two
# equal sum subarrays
# Returns split point. If not possible, then
# return -1.
def findSplitPoint(arr, n) :
leftSum = 0
# traverse array element
for i in range(0, n) :
# add current element to left Sum
leftSum += arr[i]
# find sum of rest array elements (rightSum)
rightSum = 0
for j in range(i+1, n) :
rightSum += arr[j]
# split point index
if (leftSum == rightSum) :
return i+1
# if it is not possible to split array into
# two parts
return -1
# Prints two parts after finding split point using
# findSplitPoint()
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='')
# driver program
arr = [1 , 2 , 3 , 4 , 5 , 5]
n = len(arr)
printTwoParts(arr, n)
# This code is contributed by Manish Shaw
# (manishshaw1)
C#
// C# program to split an array
// into two equal sum subarrays
using System;
class GFG {
// Returns split point. If
// not possible, then return -1.
static int findSplitPoint(int []arr, int n)
{
int leftSum = 0 ;
// traverse array element
for (int i = 0; i < n; i++)
{
// add current element to left Sum
leftSum += arr[i] ;
// find sum of rest array
// elements (rightSum)
int rightSum = 0 ;
for (int j = i+1 ; j < n ; j++ )
rightSum += arr[j] ;
// split point index
if (leftSum == rightSum)
return i+1 ;
}
// if it is not possible to
// split array into two parts
return -1;
}
// Prints two parts after finding
// split point using findSplitPoint()
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] + " ");
}
}
// Driver program
public static void Main ()
{
int []arr = {1 , 2 , 3 , 4 , 5 , 5 };
int n = arr.Length;
printTwoParts(arr, n);
}
}
// This code is contributed by nitin mittal
PHP
<?php
// PHP program to split
// an array into Two
// equal sum subarrays
// Returns split point.
// If not possible, then
// return -1.
function findSplitPoint( $arr, $n)
{
$leftSum = 0 ;
// traverse array element
for($i = 0; $i < $n; $i++)
{
// add current element
// to left Sum
$leftSum += $arr[$i] ;
// find sum of rest array
// elements (rightSum)
$rightSum = 0 ;
for($j = $i + 1 ; $j < $n ; $j++ )
$rightSum += $arr[$j] ;
// split point index
if ($leftSum == $rightSum)
return $i+1 ;
}
// if it is not possible
// to split array into
// two parts
return -1;
}
// Prints two parts after
// finding split point using
// findSplitPoint()
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] , " " ;
}
}
// Driver Code
$arr = array(1 , 2 , 3 , 4 , 5 , 5);
$n = count($arr);
printTwoParts($arr, $n);
// This code is contributed by anuj_67.
?>
JavaScript
<script>
// Java script program to split an array
// into two equal sum subarrays
// Returns split point. If
// not possible, then return -1.
function findSplitPoint(arr,n)
{
let leftSum = 0 ;
// traverse array element
for (let i = 0; i < n; i++)
{
// add current element to left Sum
leftSum += arr[i] ;
// find sum of rest array
// elements (rightSum)
let rightSum = 0 ;
for (let j = i+1 ; j < n ; j++ )
rightSum += arr[j] ;
// split point index
if (leftSum == rightSum)
return i+1 ;
}
// if it is not possible to
// split array into two parts
return -1;
}
// Prints two parts after finding
// split point using findSplitPoint()
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] + " ");
}
}
// Driver program
let arr = [1 , 2 , 3 , 4 , 5 , 5 ];
let n = arr.length;
printTwoParts(arr, n);
// contributed by sravan kumar
</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++
// C++ program to split an array into Two
// equal sum subarrays
#include<bits/stdc++.h>
using namespace std;
// Returns split point. If not possible, then
// return -1.
int findSplitPoint(int arr[], int n)
{
// traverse array element and compute sum
// of whole array
int leftSum = 0;
for (int i = 0 ; i < n ; i++)
leftSum += arr[i];
// again traverse array and compute right sum
// and also check left_sum equal to right
// sum or not
int rightSum = 0;
for (int i=n-1; i >= 0; i--)
{
// add current element to right_sum
rightSum += arr[i];
// exclude current element to the left_sum
leftSum -= arr[i] ;
if (rightSum == leftSum)
return i ;
}
// if it is not possible to split array
// into two parts.
return -1;
}
// Prints two parts after finding split point using
// findSplitPoint()
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] << " " ;
}
}
// driver program
int main()
{
int arr[] = {1 , 2 , 3 , 4 , 5 , 5 };
int n = sizeof(arr)/sizeof(arr[0]);
printTwoParts(arr, n);
return 0;
}
Java
// java program to split an array
// into Two equal sum subarrays
import java.io.*;
class GFG {
// Returns split point. If not possible, then
// return -1.
static int findSplitPoint(int arr[], int n)
{
// traverse array element and compute sum
// of whole array
int leftSum = 0;
for (int i = 0 ; i < n ; i++)
leftSum += arr[i];
// again traverse array and compute right
// sum and also check left_sum equal to
// right sum or not
int rightSum = 0;
for (int i = n-1; i >= 0; i--)
{
// add current element to right_sum
rightSum += arr[i];
// exclude current element to the left_sum
leftSum -= arr[i] ;
if (rightSum == leftSum)
return i ;
}
// if it is not possible to split array
// into two parts.
return -1;
}
// Prints two parts after finding split
// point using findSplitPoint()
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] + " ");
}
}
// Driver program
public static void main (String[] args) {
int arr[] = {1 , 2 , 3 , 4 , 5 , 5 };
int n = arr.length;
printTwoParts(arr, n);
}
}
// This code is contributed by vt_m
Python3
# Python3 program to split
# an array into Two
# equal sum subarrays
# Returns split point.
# If not possible,
# then return -1.
def findSplitPoint(arr, n) :
# traverse array element and
# compute sum of whole array
leftSum = 0
for i in range(0, n) :
leftSum += arr[i]
# again traverse array and
# compute right sum and also
# check left_sum equal to
# right sum or not
rightSum = 0
for i in range(n-1, -1, -1) :
# add current element
# to right_sum
rightSum += arr[i]
# exclude current element
# to the left_sum
leftSum -= arr[i]
if (rightSum == leftSum) :
return i
# if it is not possible
# to split array into
# two parts.
return -1
# Prints two parts after
# finding split point
# using findSplitPoint()
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 = " ")
# Driver Code
arr = [1, 2, 3, 4, 5, 5]
n = len(arr)
printTwoParts(arr, n)
# This code is contributed by Manish Shaw
# (manishshaw1)
C#
// C# program to split an array
// into Two equal sum subarrays
using System;
class GFG {
// Returns split point. If not possible, then
// return -1.
static int findSplitPoint(int []arr, int n)
{
// traverse array element and compute sum
// of whole array
int leftSum = 0;
for (int i = 0 ; i < n ; i++)
leftSum += arr[i];
// again traverse array and compute right
// sum and also check left_sum equal to
// right sum or not
int rightSum = 0;
for (int i = n-1; i >= 0; i--)
{
// add current element to right_sum
rightSum += arr[i];
// exclude current element to the left_sum
leftSum -= arr[i] ;
if (rightSum == leftSum)
return i ;
}
// if it is not possible to split array
// into two parts.
return -1;
}
// Prints two parts after finding split
// point using findSplitPoint()
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] + " ");
}
}
// Driver program
public static void Main (String[] args) {
int []arr = {1 , 2 , 3 , 4 , 5 , 5 };
int n = arr.Length;
printTwoParts(arr, n);
}
}
// This code is contributed by parashar
PHP
<?php
// PHP program to split
// an array into Two
// equal sum subarrays
// Returns split point.
// If not possible,
// then return -1.
function findSplitPoint($arr, $n)
{
// traverse array element and
// compute sum of whole array
$leftSum = 0;
for ( $i = 0 ; $i < $n ; $i++)
$leftSum += $arr[$i];
// again traverse array and
// compute right sum and also
// check left_sum equal to
// right sum or not
$rightSum = 0;
for ($i = $n - 1; $i >= 0; $i--)
{
// add current element
// to right_sum
$rightSum += $arr[$i];
// exclude current element
// to the left_sum
$leftSum -= $arr[$i] ;
if ($rightSum == $leftSum)
return $i ;
}
// if it is not possible
// to split array into
// two parts.
return -1;
}
// Prints two parts after
// finding split point
// using findSplitPoint()
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] , " " ;
}
}
// Driver Code
$arr = array(1, 2, 3, 4, 5, 5);
$n = count($arr);
printTwoParts($arr, $n);
// This code is contributed by anuj_67.
?>
JavaScript
<script>
// Javascript program to split an array
// into Two equal sum subarrays
// Returns split point. If not possible, then
// return -1.
function findSplitPoint(arr, n)
{
// traverse array element and compute sum
// of whole array
let leftSum = 0;
for (let i = 0 ; i < n ; i++)
leftSum += arr[i];
// again traverse array and compute right
// sum and also check left_sum equal to
// right sum or not
let rightSum = 0;
for (let i = n-1; i >= 0; i--)
{
// add current element to right_sum
rightSum += arr[i];
// exclude current element to the left_sum
leftSum -= arr[i] ;
if (rightSum == leftSum)
return i ;
}
// if it is not possible to split array
// into two parts.
return -1;
}
// Prints two parts after finding split
// point using findSplitPoint()
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);
// This code is contributed by rameshtravel07.
</script>
Time Complexity : O(n)
Auxiliary Space : O(1)
Related Topic: Subarrays, Subsequences, and Subsets in Array
Similar Reads
Count ways to split array into two subarrays with equal GCD
Given an array, arr[] of size N, the task is to count the number of ways to split given array elements into two subarrays such that GCD of both the subarrays are equal. Examples: Input: arr[] = {8, 4, 4, 8, 12} Output: 2 Explanation: Possible ways to split the array two groups of equal GCD are: { {{
8 min read
Find array elements equal to sum of any subarray of at least size 2
Given an array arr[], the task is to find the elements from the array which are equal to the sum of any sub-array of size greater than 1.Examples: Input: arr[] = {1, 2, 3, 4, 5, 6} Output: 3, 5, 6 Explanation: The elements 3, 5, 6 are equal to sum of subarrays {1, 2},{2, 3} and {1, 2, 3} respectivel
6 min read
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]
9 min read
Split array into three equal sum segments
Given an integer array arr[], the task is to divide the array into three non-empty contiguous segments with equal sum. In other words, we need to return an index pair [i, j], such that sum(arr[0...i]) = sum(arr[i+1...j]) = sum(arr[j+1...n-1]). Note: If it is impossible to divide the array into three
14 min read
Count of subarrays having sum equal to its length
Given an array arr[] of size N, the task is to find the number of subarrays having the sum of its elements equal to the number of elements in it. Examples: Input: N = 3, arr[] = {1, 0, 2}Output: 3Explanation:Total number of subarrays are 6 i.e., {1}, {0}, {2}, {1, 0}, {0, 2}, {1, 0, 2}.Out of 6 only
7 min read
Number of subarrays for which product and sum are equal
Given a array of n numbers. We need to count the number of subarrays having the product and sum of elements are equal Examples: Input : arr[] = {1, 3, 2} Output : 4 The subarrays are : [0, 0] sum = 1, product = 1, [1, 1] sum = 3, product = 3, [2, 2] sum = 2, product = 2 and [0, 2] sum = 1+3+2=6, pro
5 min read
Find an array of size N having exactly K subarrays with sum S
Given three integers N, K and S, the task is to choose an array of size N such that there exists exactly K sub-arrays with sum S.Note: There can be many solution arrays to this problem.Examples: Input: N = 4, K = 2, S = 3 Output: 1 2 3 4 Explanation: One of the possible array is [ 1, 2, 3, 4 ] There
4 min read
Partition a Set into Two Subsets of Equal Sum
Given an array arr[], the task is to check if it can be partitioned into two parts such that the sum of elements in both parts is the same.Note: Each element is present in either the first subset or the second subset, but not in both.Examples: Input: arr[] = [1, 5, 11, 5]Output: true Explanation: Th
15+ min read
Count of subarrays having sum equal to its length | Set 2
Given an array arr[] of size N, the task is to find the number of subarrays having sum of its elements equal to the number of elements in it. Examples: Input: N = 3, arr[] = {1, 0, 2}Output: 3Explanation:Total number of subarrays are 6 i.e., {1}, {0}, {2}, {1, 0}, {0, 2}, {1, 0, 2}.Out of the 6 suba
7 min read
Find a subarray whose sum is divisible by size of the array
Given an array arr[] of length N. The task is to check if there exists any subarray whose sum is a multiple of N. If there exists such subarray, then print the starting and ending index of that subarray else print -1. If there are multiple such subarrays, print any of them. Examples: Input: arr[] =
13 min read