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
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
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
Find the longest Subarray with equal Sum and Product Given an array arr[] of N integers, the task is to find the length of the longest subarray where the sum of the elements in the subarray is equal to the product of the elements in the subarray. Examples: Input: arr[] = [1, 2, 1, 2, 2, 5, 6, 24]Output: 5Explanation: The subarray [1, 2, 1, 2, 2] has a
11 min read
Dividing an array into two halves of same sum Given an even size array of integers. We need to find if it is possible to divide array elements into two sets such that following conditions are true. Size of both subsets is same.Sum of elements in bot sets is same.Every element is part of one of the two sets. Examples : Input: arr[] = {1, 3, 2, 1
10 min read
Print all subarrays with sum in a given range Given an array arr[] of positive integers and two integers L and R defining the range [L, R]. The task is to print the subarrays having sum in the range L to R. Examples: Input: arr[] = {1, 4, 6}, L = 3, R = 8Output: {1, 4}, {4}, {6}.Explanation: All the possible subarrays are the following{1] with
5 min read