logo

Scopri se l'array può essere diviso in due sottoarray di uguale somma

Dato un array di interi, verificare se è possibile rimuovere esattamente un intero dall'array che divide l'array in due sottoarray con la stessa somma.

Esempi: 



  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

UN soluzione ingenua sarebbe considerare tutti gli elementi dell'array e calcolare la loro somma sinistra e destra e restituire vero se la somma sinistra e destra risulta essere uguale. La complessità temporale di questa soluzione sarebbe O(n2).

IL soluzione efficiente comporta il calcolo anticipato della somma di tutti gli elementi dell'array. Quindi per ciascun elemento dell'array possiamo calcolare la somma corretta in tempo O(1) utilizzando la somma totale degli elementi dell'array meno la somma degli elementi trovati finora. La complessità temporale di questa soluzione sarebbe O(n) e lo spazio ausiliario da essa utilizzato sarà O(1).

Di seguito è riportata l'implementazione dell'approccio di cui sopra:



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>

Produzione
The array can be divided intotwo subarrays with equal sum The two subarrays are - [ 6 ] [ 3 2 1 ]