Split array into two subarrays such that difference of their sum is minimum
Given an integer array arr[], the task is to split the given array into two subarrays such that the difference between their sum is minimum.
Examples:
Input: arr[] = {7, 9, 5, 10}
Output: 1
Explanation: The difference between the sum of the subarrays {7, 9} and {5, 10} is equal to [16 – 15] = 1, which is the minimum possible.
Input: arr[] = {6, 6, 6}
Output: 6
Naive Approach: The idea is to use the Prefix and Suffix Sum array technique. Generate the prefix sum array and the suffix sum array of the given array. Now, iterate over the array and print the minimum difference between prefix_sum[i] and suffix_sum[i+1], for any index i ( 0 <= i <= N – 1) from the array.
Time Complexity: O(N)
Auxiliary Space: O(N)
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int minDiffSubArray( int arr[], int n)
{
int prefix_sum[n];
prefix_sum[0] = arr[0];
for ( int i = 1; i < n; i++)
prefix_sum[i] = prefix_sum[i - 1] +
arr[i];
int suffix_sum[n];
suffix_sum[n - 1] = arr[n - 1];
for ( int i = n - 2; i >= 0; i--)
suffix_sum[i] = suffix_sum[i + 1] +
arr[i];
int minDiff = INT_MAX;
for ( int i = 0; i < n - 1; i++)
{
int diff = abs (prefix_sum[i] -
suffix_sum[i + 1]);
if (diff < minDiff)
minDiff = diff;
}
return minDiff;
}
int main()
{
int arr[] = { 7, 9, 5, 10 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << minDiffSubArray(arr, n);
}
|
Java
import java.util.*;
import java.lang.*;
class GFG {
static int minDiffSubArray( int arr[], int n)
{
int [] prefix_sum = new int [n];
prefix_sum[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
prefix_sum[i]
= prefix_sum[i - 1 ] + arr[i];
int [] suffix_sum = new int [n];
suffix_sum[n - 1 ] = arr[n - 1 ];
for ( int i = n - 2 ; i >= 0 ; i--)
suffix_sum[i]
= suffix_sum[i + 1 ] + arr[i];
int minDiff = Integer.MAX_VALUE;
for ( int i = 0 ; i < n - 1 ; i++) {
int diff
= Math.abs(prefix_sum[i]
- suffix_sum[i + 1 ]);
if (diff < minDiff)
minDiff = diff;
}
return minDiff;
}
public static void main(String[] args)
{
int [] arr = { 7 , 9 , 5 , 10 };
int n = arr.length;
System.out.println(
minDiffSubArray(arr, n));
}
}
|
Python3
import sys
def minDiffSubArray(arr, n):
prefix_sum = [ 0 ] * n
prefix_sum[ 0 ] = arr[ 0 ]
for i in range ( 1 , n):
prefix_sum[i] = (prefix_sum[i - 1 ] +
arr[i])
suffix_sum = [ 0 ] * n
suffix_sum[n - 1 ] = arr[n - 1 ]
for i in range (n - 2 , - 1 , - 1 ):
suffix_sum[i] = (suffix_sum[i + 1 ] +
arr[i])
minDiff = sys.maxsize
for i in range (n - 1 ):
diff = abs (prefix_sum[i] -
suffix_sum[i + 1 ])
if (diff < minDiff):
minDiff = diff
return minDiff
if __name__ = = '__main__' :
arr = [ 7 , 9 , 5 , 10 ]
n = len (arr)
print (minDiffSubArray(arr, n))
|
C#
using System;
class GFG{
static int minDiffSubArray( int []arr,
int n)
{
int [] prefix_sum = new int [n];
prefix_sum[0] = arr[0];
for ( int i = 1; i < n; i++)
prefix_sum[i] = prefix_sum[i - 1] +
arr[i];
int [] suffix_sum = new int [n];
suffix_sum[n - 1] = arr[n - 1];
for ( int i = n - 2; i >= 0; i--)
suffix_sum[i] = suffix_sum[i + 1] +
arr[i];
int minDiff = int .MaxValue;
for ( int i = 0; i < n - 1; i++)
{
int diff = Math.Abs(prefix_sum[i] -
suffix_sum[i + 1]);
if (diff < minDiff)
minDiff = diff;
}
return minDiff;
}
public static void Main(String[] args)
{
int [] arr = {7, 9, 5, 10};
int n = arr.Length;
Console.WriteLine(minDiffSubArray(arr, n));
}
}
|
Javascript
<script>
function minDiffSubArray(arr, n)
{
let prefix_sum = new Array(n);
prefix_sum[0] = arr[0];
for (let i = 1; i < n; i++)
prefix_sum[i] = prefix_sum[i - 1] + arr[i];
let suffix_sum = new Array(n);
suffix_sum[n - 1] = arr[n - 1];
for (let i = n - 2; i >= 0; i--)
suffix_sum[i] = suffix_sum[i + 1] + arr[i];
let minDiff = Number.MAX_VALUE;
for (let i = 0; i < n - 1; i++)
{
let diff = Math.abs(prefix_sum[i] - suffix_sum[i + 1]);
if (diff < minDiff)
minDiff = diff;
}
return minDiff;
}
let arr = [7, 9, 5, 10];
let n = arr.length;
document.write(minDiffSubArray(arr, n));
</script>
|
Efficient Approach: To optimize the above approach, the idea is to calculate the total sum of the array elements. Now, iterate over the array and calculate the prefix sum of the array and find the minimum difference between the prefix sum and the difference between total sum and the prefix sum for any index of the array, i.e.,
Maximum difference between sum of subarrays = ( prefix_sum – (total_sum – prefix_sum) )
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int minDiffSubArray( int arr[], int n)
{
int total_sum = 0;
for ( int i = 0; i < n; i++)
total_sum += arr[i];
int prefix_sum = 0;
int minDiff = INT_MAX;
for ( int i = 0; i < n - 1; i++)
{
prefix_sum += arr[i];
int diff = abs ((total_sum -
prefix_sum) -
prefix_sum);
if (diff < minDiff)
minDiff = diff;
}
return minDiff;
}
int main()
{
int arr[] = { 7, 9, 5, 10 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << minDiffSubArray(arr, n) << endl;
return 0;
}
|
Java
import java.util.*;
import java.lang.*;
class GFG {
static int minDiffSubArray( int arr[], int n)
{
int total_sum = 0 ;
for ( int i = 0 ; i < n; i++)
total_sum += arr[i];
int prefix_sum = 0 ;
int minDiff = Integer.MAX_VALUE;
for ( int i = 0 ; i < n - 1 ; i++) {
prefix_sum += arr[i];
int diff
= Math.abs((total_sum
- prefix_sum)
- prefix_sum);
if (diff < minDiff)
minDiff = diff;
}
return minDiff;
}
public static void main(String[] args)
{
int [] arr = { 7 , 9 , 5 , 10 };
int n = arr.length;
System.out.println(
minDiffSubArray(arr, n));
}
}
|
Python3
import sys
def minDiffSubArray(arr, n):
total_sum = 0
for i in range (n):
total_sum + = arr[i]
prefix_sum = 0
minDiff = sys.maxsize
for i in range (n - 1 ):
prefix_sum + = arr[i]
diff = abs ((total_sum -
prefix_sum) -
prefix_sum)
if (diff < minDiff):
minDiff = diff
return minDiff
arr = [ 7 , 9 , 5 , 10 ]
n = len (arr)
print (minDiffSubArray(arr, n))
|
C#
using System;
class GFG{
static int minDiffSubArray( int []arr,
int n)
{
int total_sum = 0;
for ( int i = 0; i < n; i++)
total_sum += arr[i];
int prefix_sum = 0;
int minDiff = int .MaxValue;
for ( int i = 0; i < n - 1; i++)
{
prefix_sum += arr[i];
int diff = Math.Abs((total_sum -
prefix_sum) -
prefix_sum);
if (diff < minDiff)
minDiff = diff;
}
return minDiff;
}
public static void Main(String[] args)
{
int [] arr = {7, 9, 5, 10};
int n = arr.Length;
Console.WriteLine(
minDiffSubArray(arr, n));
}
}
|
Javascript
<script>
function minDiffSubArray(arr, n)
{
var total_sum = 0;
for ( var i = 0; i < n; i++)
total_sum += arr[i];
var prefix_sum = 0;
var minDiff = 1000000000;
for ( var i = 0; i < n - 1; i++)
{
prefix_sum += arr[i];
var diff = Math.abs((total_sum -
prefix_sum) -
prefix_sum);
if (diff < minDiff)
minDiff = diff;
}
return minDiff;
}
var arr = [7, 9, 5, 10];
var n = arr.length;
document.write( minDiffSubArray(arr, n));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Related Topic: Subarrays, Subsequences, and Subsets in Array
Last Updated :
11 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...