Given an array arr[] of integers, the task is to find the minimum non-negative integer k such that there exists an index j in the given array such that when arr[j] is updated as arr[j] + k, the sum of elements of an array from index arr[0] to arr[j] is equal to the sum of elements from arr[j + 1] to arr[n – 1] i.e.
arr[0] + arr[1] + … + arr[j] = arr[j + 1] + arr[j + 2] + … + arr[n – 1]
If no such k exists then print -1.
Examples:
Input: arr[] = {6, 7, 1, 3, 8, 2, 4}
Output: 3
If 3 is added to 1 sum of elements from index 0 to 2 and 3 to 6 will be equal to 17.
Input: arr[] = {7, 3}
Output: -1
A simple approach is to run two loops. For every element, find the difference between sums of elements on the left and right. Finally, return the minimum difference between the two sums.
An efficient approach: is to first calculate the prefix sum and store in an array pre[] where pre[i] stores the sum of array elements from arr[0] to arr[i]. For each index, if the sum of elements left to it (including the element itself i.e. pre[i]) is less than or equal to the sum of right elements (pre[n – 1] – pre[i]) then update the value of k as min(k, (pre[n – 1] – pre[i]) – pre[i])
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int FindMinNum( int arr[], int n)
{
int pre[n];
pre[0] = arr[0];
for ( int i = 1; i < n; i++)
pre[i] = pre[i - 1] + arr[i];
int k = INT_MAX;
for ( int i = 0; i < n - 1; i++) {
int rightSum = pre[n - 1] - pre[i];
if (rightSum >= pre[i])
k = min(k, rightSum - pre[i]);
}
if (k != INT_MAX)
return k;
return -1;
}
int main()
{
int arr[] = { 6, 7, 1, 3, 8, 2, 4 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << FindMinNum(arr, n);
return 0;
}
|
Java
class GfG
{
static int FindMinNum( int arr[], int n)
{
int pre[] = new int [n];
pre[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
pre[i] = pre[i - 1 ] + arr[i];
int k = Integer.MAX_VALUE;
for ( int i = 0 ; i < n - 1 ; i++)
{
int rightSum = pre[n - 1 ] - pre[i];
if (rightSum >= pre[i])
k = Math.min(k, rightSum - pre[i]);
}
if (k != Integer.MAX_VALUE)
return k;
return - 1 ;
}
public static void main(String[] args)
{
int arr[] = { 6 , 7 , 1 , 3 , 8 , 2 , 4 };
int n = arr.length;
System.out.println(FindMinNum(arr, n));
}
}
|
Python3
import sys
def FindMinNum(arr, n):
pre = [ 0 for i in range (n)]
pre[ 0 ] = arr[ 0 ]
for i in range ( 1 , n, 1 ):
pre[i] = pre[i - 1 ] + arr[i]
k = sys.maxsize
for i in range (n - 1 ):
rightSum = pre[n - 1 ] - pre[i]
if (rightSum > = pre[i]):
k = min (k, rightSum - pre[i])
if (k ! = sys.maxsize):
return k
return - 1
if __name__ = = '__main__' :
arr = [ 6 , 7 , 1 , 3 , 8 , 2 , 4 ]
n = len (arr)
print (FindMinNum(arr, n))
|
C#
using System;
class GfG
{
static int FindMinNum( int []arr, int n)
{
int []pre = new int [n];
pre[0] = arr[0];
for ( int i = 1; i < n; i++)
pre[i] = pre[i - 1] + arr[i];
int k = int .MaxValue;
for ( int i = 0; i < n - 1; i++)
{
int rightSum = pre[n - 1] - pre[i];
if (rightSum >= pre[i])
k = Math.Min(k, rightSum - pre[i]);
}
if (k != int .MaxValue)
return k;
return -1;
}
public static void Main()
{
int []arr = { 6, 7, 1, 3, 8, 2, 4 };
int n = arr.Length;
Console.WriteLine(FindMinNum(arr, n));
}
}
|
PHP
<?php
function FindMinNum( $arr , $n )
{
$pre = array ();
$pre [0] = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
$pre [ $i ] = $pre [ $i - 1] + $arr [ $i ];
$k = PHP_INT_MAX;
for ( $i = 0; $i < $n - 1; $i ++)
{
$rightSum = $pre [ $n - 1] - $pre [ $i ];
if ( $rightSum >= $pre [ $i ])
$k = min( $k , $rightSum - $pre [ $i ]);
}
if ( $k != PHP_INT_MAX)
return $k ;
return -1;
}
$arr = array (6, 7, 1, 3, 8, 2, 4);
$n = sizeof( $arr );
echo FindMinNum( $arr , $n );
?>
|
Javascript
<script>
function FindMinNum(arr, n)
{
var pre = new Array(n);
pre[0] = arr[0];
for ( var i = 1; i < n; i++)
pre[i] = pre[i - 1] + arr[i];
var k = Number.MAX_VALUE;
for ( var i = 0; i < n - 1; i++) {
var rightSum = pre[n - 1] - pre[i];
if (rightSum >= pre[i])
k = Math.min(k, rightSum - pre[i]);
}
if (k != Number.MAX_VALUE)
return k;
return -1;
}
var arr = [6, 7, 1, 3, 8, 2, 4];
var n = arr.length;
document.write(FindMinNum(arr, n))
</script>
|
Time Complexity : O(n)
Auxiliary Space : O(n)
Further optimization: We can avoid the use of extra space using the below steps.
- First, compute the sum of all the elements and store it in a variable sum.
- Iterate a loop for every index where the left sum at any index can be computed by keep on adding the current elements to the leftsum variable.
- The rightsum can be calculated by keep on subtracting the elements at every index from the sum variable.
- For any ith index if we find that the rightsum is greater than the leftsum then we update the value of k.
Below is the code for the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
int FindMinNum( int arr[], int n)
{
int sum = 0;
int leftsum = 0;
int k = INT_MAX;
for ( int i = 0; i < n; ++i)
sum += arr[i];
for ( int i = 0; i < n; ++i) {
sum -= arr[i];
leftsum += arr[i];
if (sum >= leftsum)
k = min(k, sum - leftsum);
}
if (k != INT_MAX)
return k;
return -1;
}
int main()
{
int arr[] = { 6, 7, 1, 3, 8, 2, 4 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << FindMinNum(arr, n);
return 0;
}
|
Java
class GfG {
static int FindMinNum( int arr[], int n)
{
int sum = 0 ;
int leftsum = 0 ;
int k = Integer.MAX_VALUE;
for ( int i = 0 ; i < n; ++i)
sum += arr[i];
for ( int i = 0 ; i < n; ++i) {
sum -= arr[i];
leftsum
+= arr[i];
if (sum >= leftsum)
k = Math.min(k, sum - leftsum);
}
if (k != Integer.MAX_VALUE)
return k;
return - 1 ;
}
public static void main(String[] args)
{
int arr[] = { 6 , 7 , 1 , 3 , 8 , 2 , 4 };
int n = arr.length;
System.out.println(FindMinNum(arr, n));
}
}
|
Python3
import sys
import math
class GfG :
@staticmethod
def FindMinNum( arr, n) :
sum = 0
leftsum = 0
k = sys.maxsize
i = 0
while (i < n) :
sum + = arr[i]
i + = 1
i = 0
while (i < n) :
sum - = arr[i]
leftsum + = arr[i]
if ( sum > = leftsum) :
k = min (k, sum - leftsum)
i + = 1
if (k ! = sys.maxsize) :
return k
return - 1
@staticmethod
def main( args) :
arr = [ 6 , 7 , 1 , 3 , 8 , 2 , 4 ]
n = len (arr)
print (GfG.FindMinNum(arr, n))
if __name__ = = "__main__" :
GfG.main([])
|
C#
using System;
class GfG {
static int FindMinNum( int [] arr, int n)
{
int sum = 0;
int leftsum = 0;
int k = int .MaxValue;
for ( int i = 0; i < n; ++i)
sum += arr[i];
for ( int i = 0; i < n; ++i) {
sum -= arr[i];
leftsum
+= arr[i];
if (sum >= leftsum)
k = Math.Min(k, sum - leftsum);
}
if (k != int .MaxValue)
return k;
return -1;
}
public static void Main()
{
int [] arr = { 6, 7, 1, 3, 8, 2, 4 };
int n = arr.Length;
Console.WriteLine(FindMinNum(arr, n));
}
}
|
Javascript
<script>
function FindMinNum(arr, n)
{
var sum = 0;
var leftsum = 0;
var k = Number.MAX_VALUE;
for ( var i = 0; i < n; ++i)
sum += arr[i];
for ( var i = 0; i < n; ++i)
{
sum -= arr[i];
leftsum+=arr[i];
if (sum >= leftsum)
k = Math.min(k, sum - leftsum);
}
if (k != Number.MAX_VALUE)
return k;
return -1;
}
var arr = [6, 7, 1, 3, 8, 2, 4];
var n = arr.length;
document.write(FindMinNum(arr, n))
</script>
|
The idea is similar to optimized solution of equilibrium index problem.
Time Complexity : O(n)
Auxiliary Space : O(1)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
21 Nov, 2022
Like Article
Save Article