Find an element in array such that sum of left array is equal to sum of right array
Given, an array of size n. Find an element which divides the array in two sub-arrays with equal sum.
Examples:
Input : 1 4 2 5 Output : 2 Explanation : If 2 is the partition, subarrays are : {1, 4} and {5} Input : 2 3 4 1 4 5 Output : 1 Explanation : If 1 is the partition, Subarrays are : {2, 3, 4} and {4, 5}
Method 1 (Simple)
Consider every element starting from second element. Compute sum of elements on its left and sum of elements on its right. If these two sums are same, return the element.
Method 2 (Using Prefix and Suffx Arrays :
We form a prefix and suffix sum arrays Given array : 1 4 2 5 Prefix Sum : 1 5 7 12 Suffix Sum : 12 11 7 5 Now, we will traverse both prefix arrays. The index at which they yield equal result, is the index where the array is partitioned with equal sum.
Implementation :
C++
#include <bits/stdc++.h> using namespace std; int findElement( int arr[], int n) { // Forming prefix sum array from 0 int prefixSum[n]; prefixSum[0] = arr[0]; for ( int i = 1; i < n; i++) prefixSum[i] = prefixSum[i - 1] + arr[i]; // Forming suffix sum array from n-1 int suffixSum[n]; suffixSum[n - 1] = arr[n - 1]; for ( int i = n - 2; i >= 0; i--) suffixSum[i] = suffixSum[i + 1] + arr[i]; // Find the point where prefix and suffix // sums are same. for ( int i = 1; i < n - 1; i++) if (prefixSum[i] == suffixSum[i]) return arr[i]; return -1; } // Driver code int main() { int arr[] = { 1, 4, 2, 5 }; int n = sizeof (arr) / sizeof (arr[0]); cout << findElement(arr, n); return 0; } |
Java
// Java program to find an element // such that sum of right side element // is equal to sum of left side public class GFG { // Finds an element in an array such that // left and right side sums are equal static int findElement( int arr[], int n) { // Forming prefix sum array from 0 int [] prefixSum = new int [n]; prefixSum[ 0 ] = arr[ 0 ]; for ( int i = 1 ; i < n; i++) prefixSum[i] = prefixSum[i - 1 ] + arr[i]; // Forming suffix sum array from n-1 int [] suffixSum = new int [n]; suffixSum[n - 1 ] = arr[n - 1 ]; for ( int i = n - 2 ; i >= 0 ; i--) suffixSum[i] = suffixSum[i + 1 ] + arr[i]; // Find the point where prefix and suffix // sums are same. for ( int i = 1 ; i < n - 1 ; i++) if (prefixSum[i] == suffixSum[i]) return arr[i]; return - 1 ; } // Driver code public static void main(String args[]) { int arr[] = { 1 , 4 , 2 , 5 }; int n = arr.length; System.out.println(findElement(arr, n)); } } // This code is contributed by Sumit Ghosh |
Python 3
# Python 3 Program to find an element # such that sum of right side element # is equal to sum of left side # Function for Finds an element in # an array such that left and right # side sums are equal def findElement(arr, n) : # Forming prefix sum array from 0 prefixSum = [ 0 ] * n prefixSum[ 0 ] = arr[ 0 ] for i in range ( 1 , n) : prefixSum[i] = prefixSum[i - 1 ] + arr[i] # Forming suffix sum array from n-1 suffixSum = [ 0 ] * n suffixSum[n - 1 ] = arr[n - 1 ] for i in range (n - 2 , - 1 , - 1 ) : suffixSum[i] = suffixSum[i + 1 ] + arr[i] # Find the point where prefix # and suffix sums are same. for i in range ( 1 , n - 1 , 1 ) : if prefixSum[i] = = suffixSum[i] : return arr[i] return - 1 # Driver Code if __name__ = = "__main__" : arr = [ 1 , 4 , 2 , 5 ] n = len (arr) print (findElement(arr, n)) # This code is contributed by ANKITRAI1 |
C#
// C# program to find an element // such that sum of right side element // is equal to sum of left side using System; class GFG { // Finds an element in an // array such that left // and right side sums // are equal static int findElement( int []arr, int n) { // Forming prefix sum // array from 0 int [] prefixSum = new int [n]; prefixSum[0] = arr[0]; for ( int i = 1; i < n; i++) prefixSum[i] = prefixSum[i - 1] + arr[i]; // Forming suffix sum // array from n-1 int [] suffixSum = new int [n]; suffixSum[n - 1] = arr[n - 1]; for ( int i = n - 2; i >= 0; i--) suffixSum[i] = suffixSum[i + 1] + arr[i]; // Find the point where prefix // and suffix sums are same. for ( int i = 1; i < n - 1; i++) if (prefixSum[i] == suffixSum[i]) return arr[i]; return -1; } // Driver code public static void Main() { int []arr = { 1, 4, 2, 5 }; int n = arr.Length; Console.WriteLine(findElement(arr, n)); } } // This code is contributed by anuj_67. |
PHP
<?php function findElement(& $arr , $n ) { // Forming prefix sum array from 0 $prefixSum = array_fill (0, $n , NULL); $prefixSum [0] = $arr [0]; for ( $i = 1; $i < $n ; $i ++) $prefixSum [ $i ] = $prefixSum [ $i - 1] + $arr [ $i ]; // Forming suffix sum array from n-1 $suffixSum = array_fill (0, $n , NULL); $suffixSum [ $n - 1] = $arr [ $n - 1]; for ( $i = $n - 2; $i >= 0; $i --) $suffixSum [ $i ] = $suffixSum [ $i + 1] + $arr [ $i ]; // Find the point where prefix // and suffix sums are same. for ( $i = 1; $i < $n - 1; $i ++) if ( $prefixSum [ $i ] == $suffixSum [ $i ]) return $arr [ $i ]; return -1; } // Driver code $arr = array ( 1, 4, 2, 5 ); $n = sizeof( $arr ); echo findElement( $arr , $n ); // This code is contributed // by ChitraNayal ?> |
Output:
2
Method 3 (Space efficient)
We calculate the sum of the whole array except the first element in right_sum, considering it to be the partitioning element. Now, we traverse the array from left to right, subtracting an element from right_sum and adding an element to left_sum. The point where right_sum equals left_sum, we get the partition.
Below is the implementation :
C++
#include <bits/stdc++.h> using namespace std; // Function to compute partition int findElement( int arr[], int size) { int right_sum = 0, left_sum = 0; // Computing right_sum for ( int i = 1; i < size; i++) right_sum += arr[i]; // Checking the point of partition // i.e. left_Sum == right_sum for ( int i = 0, j = 1; j < size; i++, j++) { right_sum -= arr[j]; left_sum += arr[i]; if (left_sum == right_sum) return arr[i + 1]; } return -1; } // Driver int main() { int arr[] = { 2, 3, 4, 1, 4, 5 }; int size = sizeof (arr) / sizeof (arr[0]); cout << findElement(arr, size); return 0; } |
Java
// Java program to find an element // such that sum of right side element // is equal to sum of left side public class GFG { // Function to compute partition static int findElement( int arr[], int size) { int right_sum = 0 , left_sum = 0 ; // Computing right_sum for ( int i = 1 ; i < size; i++) right_sum += arr[i]; // Checking the point of partition // i.e. left_Sum == right_sum for ( int i = 0 , j = 1 ; j < size; i++, j++) { right_sum -= arr[j]; left_sum += arr[i]; if (left_sum == right_sum) return arr[i + 1 ]; } return - 1 ; } // Driver public static void main(String args[]) { int arr[] = { 2 , 3 , 4 , 1 , 4 , 5 }; int size = arr.length; System.out.println(findElement(arr, size)); } } // This code is contributed by Sumit Ghosh |
Python 3
# Python 3 Program to find an element # such that sum of right side element # is equal to sum of left side # Function to compute partition def findElement(arr, size) : right_sum, left_sum = 0 , 0 # Computing right_sum for i in range ( 1 , size) : right_sum + = arr[i] i, j = 0 , 1 # Checking the point of partition # i.e. left_Sum == right_sum while j < size : right_sum - = arr[j] left_sum + = arr[i] if left_sum = = right_sum : return arr[i + 1 ] j + = 1 i + = 1 return - 1 # Driver Code if __name__ = = "__main__" : arr = [ 2 , 3 , 4 , 1 , 4 , 5 ] n = len (arr) print (findElement(arr, n)) # This code is contributed by ANKITRAI1 |
C#
// C# program to find an // element such that sum // of right side element // is equal to sum of // left side using System; class GFG { // Function to compute // partition static int findElement( int []arr, int size) { int right_sum = 0, left_sum = 0; // Computing right_sum for ( int i = 1; i < size; i++) right_sum += arr[i]; // Checking the point // of partition i.e. // left_Sum == right_sum for ( int i = 0, j = 1; j < size; i++, j++) { right_sum -= arr[j]; left_sum += arr[i]; if (left_sum == right_sum) return arr[i + 1]; } return -1; } // Driver Code public static void Main() { int []arr = {2, 3, 4, 1, 4, 5}; int size = arr.Length; Console.WriteLine(findElement(arr, size)); } } // This code is contributed // by anuj_67. |
PHP
<?php // Function to compute partition function findElement(& $arr , $size ) { $right_sum = 0; $left_sum = 0; // Computing right_sum for ( $i = 1; $i < $size ; $i ++) $right_sum += $arr [ $i ]; // Checking the point of partition // i.e. left_Sum == right_sum for ( $i = 0, $j = 1; $j < $size ; $i ++, $j ++) { $right_sum -= $arr [ $j ]; $left_sum += $arr [ $i ]; if ( $left_sum == $right_sum ) return $arr [ $i + 1]; } return -1; } // Driver Code $arr = array ( 2, 3, 4, 1, 4, 5 ); $size = sizeof( $arr ); echo findElement( $arr , $size ); // This code is contributed // by ChitraNayal ?> |
Output:
1
This article is contributed by Rohit Thapliyal. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Recommended Posts:
- For each element in 1st array count elements less than or equal to it in 2nd array
- For each element in 1st array count elements less than or equal to it in 2nd array | Set 2
- Find an element which divides the array in two subarrays with equal product
- Find element in a sorted array whose frequency is greater than or equal to n/2.
- Find element in array that divides all array elements
- Find if array has an element whose value is half of array sum
- Minimum element left from the array after performing given operations
- Closest greater or same value on left side for every element in array
- Check if an array can be Arranged in Left or Right Positioned Array
- Find original array from encrypted array (An array of sums of other elements)
- Count equal element pairs in the given array
- Equal sum array partition excluding a given element
- Find the index of the left pointer after possible moves in the array
- Quickly find multiple left rotations of an array | Set 1
- Sum of elements in an array with frequencies greater than or equal to that element