Keresse meg, hogy a tömb felosztható-e két egyenlő összegű altömbre
Adott egész számok tömbje határozza meg, hogy lehetséges-e pontosan egy egész számot eltávolítani abból a tömbből, amely a tömböt két altömbre osztja, azonos összeggel.
Példák:
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] and [3 2 1] having equal sum Input: arr = [6 1 3 2 5] Output: true Explanation: On removing element 3 at index 2 the array gets divided into two subarrays [6 1] and [2 5] having equal sum. Input: arr = [6 -2 -3 2 3] Output: true Explanation: On removing element 6 at index 0 the array gets divided into two sets [] and [-2 -3 2 3] having equal sum Input: arr = [6 -2 3 2 3] Output: false
A naiv megoldás az lenne, ha figyelembe vennénk a tömb összes elemét, és kiszámítanák a bal és jobb oldali összegüket, és igazat adnának vissza, ha a bal és a jobb oldali összeg egyenlő. Ennek a megoldásnak az időbonyolultsága O(n 2 ).
A hatékony megoldás magában foglalja a tömb összes elemének összegének előzetes kiszámítását. Ezután a tömb minden elemére kiszámolhatjuk a helyes összegét O(1) időben úgy, hogy a tömbelemek teljes összegét mínusz az eddig talált elemek összege. Ennek a megoldásnak az időbonyolultsága O(n), az általa használt segédtér pedig O(1).
Az alábbiakban bemutatjuk a fenti megközelítés megvalósítását:
C++ // C++ program to divide the array into two // subarrays with the same sum on removing // exactly one integer from the array #include using namespace std ; // Utility function to print the sub-array void printSubArray ( int arr [] int start int end ) { cout < < '[ ' ; for ( int i = start ; i <= end ; i ++ ) cout < < arr [ i ] < < ' ' ; cout < < '] ' ; } // Function that divides the array into two subarrays // with the same sum bool divideArray ( int arr [] int n ) { // sum stores sum of all elements of the array int sum = 0 ; for ( int i = 0 ; i < n ; i ++ ) sum += arr [ i ]; // sum stores sum till previous index of the array int sum_so_far = 0 ; for ( int i = 0 ; i < n ; i ++ ) { // If on removing arr[i] we get equals left // and right half if ( 2 * sum_so_far + arr [ i ] == sum ) { cout < < 'The array can be divided into' 'two subarrays with equal sum n The' ' two subarrays are - ' ; printSubArray ( arr 0 i - 1 ); printSubArray ( arr i + 1 n - 1 ); return true ; } // add current element to sum_so_far sum_so_far += arr [ i ]; } // The array cannot be divided cout < < 'The array cannot be divided into two ' 'subarrays with equal sum' ; return false ; } // Driver code int main () { int arr [] = { 6 2 3 2 1 }; int n = sizeof ( arr ) / sizeof ( arr [ 0 ]); divideArray ( arr n ); return 0 ; }
Java // Java program to divide the array into two // subarrays with the same sum on removing // exactly one integer from the array import java.io.* ; class GFG { // Utility function to print the sub-array static void printSubArray ( int arr [] int start int end ) { System . out . print ( '[ ' ); for ( int i = start ; i <= end ; i ++ ) System . out . print ( arr [ i ] + ' ' ); System . out . print ( '] ' ); } // Function that divides the array into two subarrays // with the same sum static boolean divideArray ( int arr [] int n ) { // sum stores sum of all elements of the array int sum = 0 ; for ( int i = 0 ; i < n ; i ++ ) sum += arr [ i ] ; // sum stores sum till previous index of the array int sum_so_far = 0 ; for ( int i = 0 ; i < n ; i ++ ) { // If on removing arr[i] we get equals left // and right half if ( 2 * sum_so_far + arr [ i ] == sum ) { System . out . print ( 'The array can be divided into ' + 'two subarrays with equal sumnThe' + ' two subarrays are - ' ); printSubArray ( arr 0 i - 1 ); printSubArray ( arr i + 1 n - 1 ); return true ; } // add current element to sum_so_far sum_so_far += arr [ i ] ; } // The array cannot be divided System . out . println ( 'The array cannot be divided into two ' + 'subarrays with equal sum' ); return false ; } // Driver program public static void main ( String [] args ) { int arr [] = { 6 2 3 2 1 }; int n = arr . length ; divideArray ( arr n ); } } // This code is contributed by Pramod Kumar
Python3 ''' Python3 program to divide the array into two subarrays with the same sum on removing exactly one integer from the array''' # Utility function to print the sub-array def printSubArray ( arr start end ): print ( '[ ' end = '' ) for i in range ( start end + 1 ): print ( arr [ i ] end = ' ' ) print ( ']' end = '' ) # Function that divides the array into # two subarrays with the same sum def divideArray ( arr n ): # sum stores sum of all # elements of the array sum = 0 for i in range ( 0 n ): sum += arr [ i ] # sum stores sum till previous # index of the array sum_so_far = 0 for i in range ( 0 n ): # If on removing arr[i] we get # equals left and right half if 2 * sum_so_far + arr [ i ] == sum : print ( 'The array can be divided into' 'two subarrays with equal sum' ) print ( 'two subarrays are -' end = '' ) printSubArray ( arr 0 i - 1 ) printSubArray ( arr i + 1 n - 1 ) return True # add current element to sum_so_far sum_so_far += arr [ i ] # The array cannot be divided print ( 'The array cannot be divided into' 'two subarrays with equal sum' end = '' ) return False # Driver code arr = [ 6 2 3 2 1 ] n = len ( arr ) divideArray ( arr n ) # This code is contributed by Shreyanshi Arun
C# // C# program to divide the array into two // subarrays with the same sum on removing // exactly one integer from the array using System ; class GFG { // Utility function to print the sub-array static void printSubArray ( int [] arr int start int end ) { Console . Write ( '[ ' ); for ( int i = start ; i <= end ; i ++ ) Console . Write ( arr [ i ] + ' ' ); Console . Write ( '] ' ); } // Function that divides the array into // two subarrays with the same sum static bool divideArray ( int [] arr int n ) { // sum stores sum of all elements of // the array int sum = 0 ; for ( int i = 0 ; i < n ; i ++ ) sum += arr [ i ]; // sum stores sum till previous index // of the array int sum_so_far = 0 ; for ( int i = 0 ; i < n ; i ++ ) { // If on removing arr[i] we get // equals left and right half if ( 2 * sum_so_far + arr [ i ] == sum ) { Console . Write ( 'The array can be' + ' divided into two subarrays' + ' with equal sumnThe two' + ' subarrays are - ' ); printSubArray ( arr 0 i - 1 ); printSubArray ( arr i + 1 n - 1 ); return true ; } // add current element to sum_so_far sum_so_far += arr [ i ]; } // The array cannot be divided Console . WriteLine ( 'The array cannot be' + ' divided into two subarrays with ' + 'equal sum' ); return false ; } // Driver program public static void Main () { int [] arr = { 6 2 3 2 1 }; int n = arr . Length ; divideArray ( arr n ); } } // This code is contributed by anuj_67.
PHP // PHP program to divide the array into two // subarrays with the same sum on removing // exactly one integer from the array // Utility function to print the sub-array function printSubArray ( $arr $start $end ) { echo '[ ' ; for ( $i = $start ; $i <= $end ; $i ++ ) echo $arr [ $i ] . ' ' ; echo '] ' ; } // Function that divides the // array into two subarrays // with the same sum function divideArray ( $arr $n ) { // sum stores sum of all // elements of the array $sum = 0 ; for ( $i = 0 ; $i < $n ; $i ++ ) $sum += $arr [ $i ]; // sum stores sum till previous // index of the array $sum_so_far = 0 ; for ( $i = 0 ; $i < $n ; $i ++ ) { // If on removing arr[i] // we get equals left // and right half if ( 2 * $sum_so_far + $arr [ $i ] == $sum ) { echo 'The array can be divided into' . 'two subarrays with equal sum n The' . ' two subarrays are - ' ; printSubArray ( $arr 0 $i - 1 ); printSubArray ( $arr $i + 1 $n - 1 ); return true ; } // add current element // to sum_so_far $sum_so_far += $arr [ $i ]; } // The array cannot be divided echo 'The array cannot be divided into two ' . 'subarrays with equal sum' ; return false ; } // Driver code $arr = array ( 6 2 3 2 1 ); $n = sizeof ( $arr ); divideArray ( $arr $n ); // This code is contributed by Anuj_67 ?>
JavaScript < script > // JavaScript program to divide the array into two // subarrays with the same sum on removing // exactly one integer from the array // Utility function to print the sub-array function printSubArray ( arr start end ) { document . write ( '[ ' ); for ( let i = start ; i <= end ; i ++ ) document . write ( arr [ i ] + ' ' ); document . write ( '] ' ); } // Function that divides the array into // two subarrays with the same sum function divideArray ( arr n ) { // sum stores sum of all elements of // the array let sum = 0 ; for ( let i = 0 ; i < n ; i ++ ) sum += arr [ i ]; // sum stores sum till previous index // of the array let sum_so_far = 0 ; for ( let i = 0 ; i < n ; i ++ ) { // If on removing arr[i] we get // equals left and right half if ( 2 * sum_so_far + arr [ i ] == sum ) { document . write ( 'The array can be' + ' divided into two subarrays' + ' with equal sum ' + ' ' + 'The two' + ' sets are - ' ); printSubArray ( arr 0 i - 1 ); printSubArray ( arr i + 1 n - 1 ); return true ; } // add current element to sum_so_far sum_so_far += arr [ i ]; } // The array cannot be divided document . write ( 'The array cannot be' + ' divided into two subarrays with ' + 'equal sum' + ' ' ); return false ; } let arr = [ 6 2 3 2 1 ]; let n = arr . length ; divideArray ( arr n ); < /script>
Kimenet
The array can be divided intotwo subarrays with equal sum The two subarrays are - [ 6 ] [ 3 2 1 ]