logo

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(n2).

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 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  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 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 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 ]