Compruebe si la array dada se puede agrupar en N/2 pares con la misma suma

Dada una array A[] de enteros cuya longitud es N , (donde N es par), la tarea es verificar si A[] se puede agrupar en N/2 pares que tengan la misma suma.

Ejemplos: 

Entrada: N = 6, A[] = {4, 5, 3, 1, 2, 6}
Salida: Verdadero
Explicación: Considere los pares {1, 6}, {5, 2} y {4, 3}. 
Los 3 tienen una suma = 7. 
Por lo tanto, la array dada se puede dividir en N/2, es decir, 3 pares que tienen la misma suma.

Entrada: N = 8, A[] = {1, 1, 1, 1, 1, 1, 2, 3}
Salida: Falso

 

Enfoque: La idea para resolver el problema es utilizar un enfoque de dos punteros siguiendo la siguiente observación.

 Si existen N/2 pares que tienen la misma suma, entonces la suma de cada par debe ser igual a min + max , donde min es el elemento mínimo de la array y max es el elemento máximo de la array.

Siga los pasos mencionados a continuación para resolver el problema basado en la observación anterior:

  • Ordenar la array dada.
  • Inicialice una variable (por ejemplo , target ) igual a la suma del primer y último elemento de la array ordenada.
  • Inicialice dos punteros que apunten al primer y último elemento.
    • Incremente y disminuya los punteros simultáneamente y verifique si la suma de los elementos en los punteros es igual al objetivo.
    • Si es así, continúe con la iteración.
    • De lo contrario, devuelve falso.
  • Una vez completada la iteración, devuelve verdadero.

A continuación se muestra la implementación del enfoque anterior.

C++

// C++ code for the above approach.
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to check if it is possible
// to divide the given array into
// N/2 pairs having equal sum
bool isPossible(int N, int A[])
{
    // Sorting the given array
    sort(A, A + N);
 
    // Initializing target as the sum of
    // minimum and maximum element
    int target = A[0] + A[N - 1];
 
    // Initializing two pointers
    int i = 0, j = N - 1;
 
    while (i < j) {
 
        // If sum of elements at i and j
        // is equal to target then,
        // increment and decrement i and j
        // respectively
        if (A[i] + A[j] == target) {
            i++;
            j--;
        }
 
        // Else return false
        else {
            return false;
        }
    }
 
    // After whole array is traversed,
    // which means N/2 pairs have sum
    // equal to target, hence return true
    return true;
}
 
// Driver Code
int main()
{
    int N = 6;
    int A[] = { 4, 5, 3, 1, 2, 6 };
 
    // Function call
    bool answer = isPossible(N, A);
    if (answer)
        cout << "True";
    else
        cout << "False";
    return 0;
}

Java

// JAVA code for the above approach.
import java.util.*;
class GFG
{
   
  // Function to check if it is possible
  // to divide the given array into
  // N/2 pairs having equal sum
  public static boolean isPossible(int N, int A[])
  {
    // Sorting the given array
    Arrays.sort(A);
 
    // Initializing target as the sum of
    // minimum and maximum element
    int target = A[0] + A[N - 1];
 
    // Initializing two pointers
    int i = 0, j = N - 1;
 
    while (i < j) {
 
      // If sum of elements at i and j
      // is equal to target then,
      // increment and decrement i and j
      // respectively
      if (A[i] + A[j] == target) {
        i++;
        j--;
      }
 
      // Else return false
      else {
        return false;
      }
    }
 
    // After whole array is traversed,
    // which means N/2 pairs have sum
    // equal to target, hence return true
    return true;
  }
 
  // Driver Code
  public static void main(String[] args)
  {
    int N = 6;
    int A[] = { 4, 5, 3, 1, 2, 6 };
 
    // Function call
    boolean answer = isPossible(N, A);
    if (answer)
      System.out.print("True");
    else
      System.out.print("False");
  }
}
 
// This code is contributed by Taranpreet

Python3

# Python3 code for the above approach.
 
# Function to check if it is possible
# to divide the given array into
# N/2 pairs having equal sum
def isPossible(N, A):
 
    # Sorting the given array
    A.sort()
 
    # Initializing target as the sum of
    # minimum and maximum element
    target = A[0] + A[N - 1]
 
    # Initializing two pointers
    i = 0
    j = N - 1
 
    while (i < j):
 
        # If sum of elements at i and j
        # is equal to target then,
        # increment and decrement i and j
        # respectively
        if (A[i] + A[j] == target):
            i += 1
            j -= 1
 
        # Else return false
        else:
            return False
 
    # After whole array is traversed,
    # which means N/2 pairs have sum
    # equal to target, hence return true
    return True
 
# Driver Code
N = 6
A = [ 4, 5, 3, 1, 2, 6 ]
 
# Function call
answer = isPossible(N, A)
if (answer):
   print("True")
else:
   print("False")
  
# This code is contributed by shinjanpatra

C#

// C# code for the above approach.
using System;
 
public class GFG{
 
  // Function to check if it is possible
  // to divide the given array into
  // N/2 pairs having equal sum
  static bool isPossible(int N, int[] A){
    // Sorting the given array
    Array.Sort(A);
 
    // Initializing target as the sum of
    // minimum and maximum element
    int target = A[0] + A[N - 1];
 
    // Initializing two pointers
    int i = 0, j = N - 1;
 
    while (i < j) {
 
      // If sum of elements at i and j
      // is equal to target then,
      // increment and decrement i and j
      // respectively
      if (A[i] + A[j] == target) {
        i++;
        j--;
      }
 
      // Else return false
      else {
        return false;
      }
    }
 
    // After whole array is traversed,
    // which means N/2 pairs have sum
    // equal to target, hence return true
    return true;
  }
 
  // Driver Code
  static public void Main (){
 
    int N = 6;
    int[] A = { 4, 5, 3, 1, 2, 6 };
 
    // Function call
    bool answer = isPossible(N, A);
    if (answer == true)
      Console.Write("True");
    else
      Console.Write("False");
  }
}
 
// This code is contributed by hrithikgarg03188.

Javascript

<script>
    // JavaScript code for the above approach.
 
 
    // Function to check if it is possible
    // to divide the given array into
    // N/2 pairs having equal sum
    const isPossible = (N, A) => {
        // Sorting the given array
        A.sort();
 
        // Initializing target as the sum of
        // minimum and maximum element
        let target = A[0] + A[N - 1];
 
        // Initializing two pointers
        let i = 0, j = N - 1;
 
        while (i < j) {
 
            // If sum of elements at i and j
            // is equal to target then,
            // increment and decrement i and j
            // respectively
            if (A[i] + A[j] == target) {
                i++;
                j--;
            }
 
            // Else return false
            else {
                return false;
            }
        }
 
        // After whole array is traversed,
        // which means N/2 pairs have sum
        // equal to target, hence return true
        return true;
    }
 
    // Driver Code
 
    let N = 6;
    let A = [4, 5, 3, 1, 2, 6];
 
    // Function call
    answer = isPossible(N, A);
    if (answer)
        document.write("True");
    else
        document.write("False");
 
// This code is contributed by rakeshsahni
 
</script>
Producción

1

Complejidad de tiempo: O (N * logN), ya que estamos utilizando la función de clasificación incorporada que costará O (N * logN).
Espacio auxiliar: O(1), ya que no estamos utilizando ningún espacio adicional.

Publicación traducida automáticamente

Artículo escrito por kamabokogonpachiro y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *