Divide array into two parts with equal sum according to the given constraints
Given an array arr[] of N integers, the task is to select an integer x (which may or may not be present in the array) and remove all of its occurrences from the array and divide the remaining array into two non-empty sub-sets such that:
- The elements of the first set are strictly smaller than x.
- The elements of the second set are strictly greater than x.
- The sum of the elements of both the sets is equal.
If such an integer exists then print Yes otherwise print No.
Examples:
Input: arr[] = {1, 2, 2, 5}
Output: Yes
Choose x = 3, after removing all of its occurrences the array becomes arr[] = {1, 2, 2, 5} {1, 2, 2} and {5} are the required sub-sets.
Input: arr[] = {2, 1}
Output: No
Approach:
The idea is to first sort the array and for all the numbers lying between 1 to maximum number present in the array, apply binary search and check if on removing all its occurrences from the array, sum of elements present on its left side (which are smaller than it) and sum of elements present on the right side (which are greater than it) is equal.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void IfExists( int arr[], int n)
{
int sum[n];
sort(arr, arr + n);
sum[0] = arr[0];
for ( int i = 1; i < n; i++)
sum[i] = sum[i - 1] + arr[i];
int max = arr[n - 1];
bool flag = false ;
for ( int i = 1; i <= max; i++) {
int findex = 0;
int lindex = 0;
int l = 0;
int r = n - 1;
while (l <= r) {
int m = (l + r) / 2;
if (arr[m] < i) {
findex = m;
l = m + 1;
}
else
r = m - 1;
}
l = 1;
r = n;
flag = false ;
while (l <= r) {
int m = (r + l) / 2;
if (arr[m] > i) {
lindex = m;
r = m - 1;
}
else
l = m + 1;
}
if (sum[findex] == sum[n - 1] - sum[lindex - 1]) {
flag = true ;
break ;
}
}
if (flag)
cout << "Yes" ;
else
cout << "No" ;
}
int main()
{
int arr[] = { 1, 2, 2, 5 };
int n = sizeof (arr) / sizeof ( int );
IfExists(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void IfExists( int arr[], int n)
{
int sum[] = new int [n];
Arrays.sort(arr);
sum[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
sum[i] = sum[i - 1 ] + arr[i];
int max = arr[n - 1 ];
boolean flag = false ;
for ( int i = 1 ; i <= max; i++)
{
int findex = 0 ;
int lindex = 0 ;
int l = 0 ;
int r = n - 1 ;
while (l <= r)
{
int m = (l + r) / 2 ;
if (arr[m] < i)
{
findex = m;
l = m + 1 ;
}
else
r = m - 1 ;
}
l = 1 ;
r = n;
flag = false ;
while (l <= r)
{
int m = (r + l) / 2 ;
if (arr[m] > i)
{
lindex = m;
r = m - 1 ;
}
else
l = m + 1 ;
}
if (sum[findex] == sum[n - 1 ] - sum[lindex - 1 ])
{
flag = true ;
break ;
}
}
if (flag)
System.out.println( "Yes" );
else
System.out.println( "No" );
}
public static void main(String args[])
{
int arr[] = { 1 , 2 , 2 , 5 };
int n = arr.length;
IfExists(arr, n);
}
}
|
Python3
def IfExists(arr, n) :
sum = [ 0 ] * n;
arr.sort();
sum [ 0 ] = arr[ 0 ];
for i in range ( 1 , n) :
sum [i] = sum [i - 1 ] + arr[i];
max = arr[n - 1 ];
flag = False ;
for i in range ( 1 , max + 1 ) :
findex = 0 ;
lindex = 0 ;
l = 0 ;
r = n - 1 ;
while (l < = r) :
m = (l + r) / / 2 ;
if (arr[m] < i) :
findex = m;
l = m + 1 ;
else :
r = m - 1 ;
l = 1 ;
r = n;
flag = False ;
while (l < = r) :
m = (r + l) / / 2 ;
if (arr[m] > i) :
lindex = m;
r = m - 1 ;
else :
l = m + 1 ;
if ( sum [findex] = = sum [n - 1 ] -
sum [lindex - 1 ]) :
flag = True ;
break ;
if (flag) :
print ( "Yes" );
else :
print ( "No" );
if __name__ = = "__main__" :
arr = [ 1 , 2 , 2 , 5 ];
n = len (arr) ;
IfExists(arr, n);
|
C#
using System;
class GFG
{
static void IfExists( int [] arr, int n)
{
int [] sum = new int [n];
Array.Sort(arr);
sum[0] = arr[0];
for ( int i = 1; i < n; i++)
sum[i] = sum[i - 1] + arr[i];
int max = arr[n - 1];
bool flag = false ;
for ( int i = 1; i <= max; i++)
{
int findex = 0;
int lindex = 0;
int l = 0;
int r = n - 1;
while (l <= r)
{
int m = (l + r) / 2;
if (arr[m] < i)
{
findex = m;
l = m + 1;
}
else
r = m - 1;
}
l = 1;
r = n;
flag = false ;
while (l <= r)
{
int m = (r + l) / 2;
if (arr[m] > i)
{
lindex = m;
r = m - 1;
}
else
l = m + 1;
}
if (sum[findex] == sum[n - 1] - sum[lindex - 1])
{
flag = true ;
break ;
}
}
if (flag)
Console.WriteLine( "Yes" );
else
Console.WriteLine( "No" );
}
public static void Main()
{
int [] arr = { 1, 2, 2, 5 };
int n = arr.Length;
IfExists(arr, n);
}
}
|
Javascript
function ifExists(arr, n) {
const sum = new Array(n).fill(0);
arr.sort((a, b) => a - b);
sum[0] = arr[0];
for (let i = 1; i < n; i++) {
sum[i] = sum[i - 1] + arr[i];
}
const max = arr[n - 1];
let flag = false ;
for (let i = 1; i <= max; i++) {
let findex = 0;
let lindex = 0;
let l = 0;
let r = n - 1;
while (l <= r) {
const m = Math.floor((l + r) / 2);
if (arr[m] < i) {
findex = m;
l = m + 1;
} else {
r = m - 1;
}
}
l = 1;
r = n;
flag = false ;
while (l <= r) {
const m = Math.floor((r + l) / 2);
if (arr[m] > i) {
lindex = m;
r = m - 1;
} else {
l = m + 1;
}
}
if (sum[findex] === sum[n - 1] - sum[lindex - 1]) {
flag = true ;
break ;
}
}
if (flag) {
console.log( "Yes" );
} else {
console.log( "No" );
}
}
const arr = [1, 2, 2, 5];
const n = arr.length;
ifExists(arr, n);
|
PHP
<?php
function IfExists( $arr , $n )
{
$sum = array_fill (0, $n , 0);
sort( $arr );
$sum [0] = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
$sum [ $i ] = $sum [ $i - 1] + $arr [ $i ];
$max = $arr [ $n - 1];
$flag = false;
for ( $i = 1; $i <= $max ; $i ++)
{
$findex = 0;
$lindex = 0;
$l = 0;
$r = $n - 1;
while ( $l <= $r )
{
$m = ( $l + $r ) / 2;
if ( $arr [ $m ] < $i )
{
$findex = $m ;
$l = $m + 1;
}
else
$r = $m - 1;
}
$l = 1;
$r = $n ;
$flag = false;
while ( $l <= $r )
{
$m = ( $r + $l ) / 2;
if ( $arr [ $m ] > $i )
{
$lindex = $m ;
$r = $m - 1;
}
else
$l = $m + 1;
}
if ( $sum [ $findex ] == $sum [ $n - 1] -
$sum [ $lindex - 1])
{
$flag = true;
break ;
}
}
if ( $flag == true)
echo "Yes" ;
else
echo "No" ;
}
$arr = array (1, 2, 2, 5 );
$n = sizeof( $arr );
IfExists( $arr , $n );
?>
|
Last Updated :
07 Aug, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...