Diferencia mínima entre grupos de tamaño dos

Dada una array de un número par de elementos, forme grupos de 2 usando estos elementos de la array de modo que la diferencia entre el grupo con la suma más alta y el que tiene la suma más baja sea mínima. 
Nota: Un elemento puede ser parte de un solo grupo y tiene que ser parte de al menos 1 grupo.
Ejemplos: 
 

Input : arr[] = {2, 6, 4, 3}
Output : 1
Groups formed will be (2, 6) and (4, 3), 
the difference between highest sum group
(2, 6) i.e 8 and lowest sum group (3, 4)
i.e 7 is 1.

Input : arr[] = {11, 4, 3, 5, 7, 1}
Output : 3
Groups formed will be (1, 11), (4, 5) and
(3, 7), the difference between highest 
sum group (1, 11) i.e 12 and lowest sum 
group (4, 5) i.e 9 is 3.

Enfoque simple: un enfoque simple sería probar con todas las combinaciones de elementos de array y verificar con cada conjunto de diferencia de combinación entre el grupo con la suma más alta y el que tiene la suma más baja. Se formarían un total de n*(n-1)/2 de tales grupos (nC2). 
Complejidad de tiempo: O (n ^ 3) Para generar grupos, se necesitarán n ^ 2 iteraciones y para verificar cada grupo se necesitarán n iteraciones y, por lo tanto, se necesitarán n ^ 3 iteraciones en el peor de los casos.
Enfoque eficiente: el enfoque eficiente sería utilizar el enfoque codicioso. Ordene toda la array y genere grupos seleccionando un elemento desde el inicio de la array y uno desde el final. 
 

C++

// CPP program to find minimum difference
// between groups of highest and lowest
// sums.
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
 
ll calculate(ll a[], ll n)
{
    // Sorting the whole array.
    sort(a, a + n);
 
    // Generating sum groups.
    vector<ll> s;
    for (int i = 0, j = n - 1; i < j; i++, j--)
       s.push_back(a[i] + a[j]);
 
    ll mini = *min_element(s.begin(), s.end());
    ll maxi = *max_element(s.begin(), s.end());
 
    return abs(maxi - mini);
}
 
int main()
{
    ll a[] = { 2, 6, 4, 3 };
    int n = sizeof(a) / (sizeof(a[0]));
    cout << calculate(a, n) << endl;
    return 0;
}

Java

// Java program to find minimum
// difference between groups of
// highest and lowest sums.
import java.util.Arrays;
import java.util.Collections;
import java.util.Vector;
 
 
class GFG {
 
static long calculate(long a[], int n)
{
    // Sorting the whole array.
    Arrays.sort(a);
    int i,j;
     
    // Generating sum groups.
    Vector<Long> s = new Vector<>();
    for (i = 0, j = n - 1; i < j; i++, j--)
        s.add((a[i] + a[j]));
         
    long mini = Collections.min(s);
    long maxi = Collections.max(s);
    return Math.abs(maxi - mini);
}
 
// Driver code
public static void main(String[] args)
{
    long a[] = { 2, 6, 4, 3 };
    int n = a.length;
    System.out.println(calculate(a, n));
    }
}
// This code is contributed by 29AjayKumar

Python3

# Python3 program to find minimum
# difference between groups of
# highest and lowest sums.
def calculate(a, n):
     
    # Sorting the whole array.
    a.sort();
 
    # Generating sum groups.
    s = [];
    i = 0;
    j = n - 1;
    while(i < j):
        s.append((a[i] + a[j]));
        i += 1;
        j -= 1;
 
    mini = min(s);
    maxi = max(s);
 
    return abs(maxi - mini);
 
# Driver Code
a = [ 2, 6, 4, 3 ];
n = len(a);
print(calculate(a, n));
 
# This is contributed by mits

C#

// C# program to find minimum
// difference between groups of
// highest and lowest sums.
using System;
using System.Linq;
using System.Collections.Generic;
 
class GFG
{
 
    static long calculate(long []a, int n)
    {
        // Sorting the whole array.
        Array.Sort(a);
        int i, j;
 
        // Generating sum groups.
        List<long> s = new List<long>();
        for (i = 0, j = n - 1; i < j; i++, j--)
            s.Add((a[i] + a[j]));
 
        long mini = s.Min();
        long maxi = s.Max();
        return Math.Abs(maxi - mini);
    }
 
    // Driver code
    public static void Main()
    {
        long []a = { 2, 6, 4, 3 };
        int n = a.Length;
        Console.WriteLine(calculate(a, n));
    }
}
 
//This code is contributed by Rajput-Ji

PHP

<?php
// PHP program to find minimum
// difference between groups of
// highest and lowest sums.
 
function calculate($a, $n)
{
    // Sorting the whole array.
    sort($a);
 
    // Generating sum groups.
    $s = array();
    for ($i = 0, $j = $n - 1;
         $i < $j; $i++, $j--)
    array_push($s, ($a[$i] + $a[$j]));
 
    $mini = min($s);
    $maxi = max($s);
 
    return abs($maxi - $mini);
}
 
// Driver Code
$a = array( 2, 6, 4, 3 );
$n = sizeof($a);
echo calculate($a, $n);
 
// This is contributed by mits
?>

Javascript

<script>
 
// Javascript program to find minimum
// difference between groups of
// highest and lowest sums
   
    function calculate(a, n)
{
    // Sorting the whole array.
    a.sort();
    let i,j;
       
    // Generating sum groups.
    let s = [];
    for (i = 0, j = n - 1; i < j; i++, j--)
        s.push((a[i] + a[j]));
           
    let mini = Math.min(...s);
    let maxi = Math.max(...s);
    return Math.abs(maxi - mini);
}
 
// driver code
 
    let a = [ 2, 6, 4, 3 ];
    let n = a.length;
    document.write(calculate(a, n));
     
</script>
Producción: 

1

 

Tiempo Complejidad: O (n * log n) 

Espacio Auxiliar: O(n)

Optimización del enfoque anterior: podemos modificar el enfoque eficiente anterior reduciendo el espacio auxiliar de O(n) a O(1). En lugar de empujar todos los grupos en un vector, podemos atravesar directamente la array y realizar un seguimiento de los grupos de elementos máximos y mínimos.

A continuación se muestra el código para el enfoque anterior:

C++

// CPP program to find minimum difference
// between groups of highest and lowest
// sums.
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
 
ll calculate(ll a[], ll n)
{
    // Sorting the whole array.
    sort(a, a + n);
     
    ll mini = a[0]+a[n-1];
    ll maxi = a[0]+a[n-1];
     
    for (int i = 1, j = n - 2; i < j; i++, j--)
    {
        if(a[i]+a[j]>maxi)
        {
            maxi=a[i]+a[j];
        }
        if(a[i]+a[j]<mini)
        {
            mini=a[i]+a[j];
        }
    }
 
    return abs(maxi - mini);
}
 
int main()
{
    ll a[] = { 2, 6, 4, 3 };
    int n = sizeof(a) / (sizeof(a[0]));
    cout << calculate(a, n) << endl;
    return 0;
}
 
// This code is contributed by Pushpesh Raj

Java

// Java program for the above approach
 
import java.io.*;
import java.util.*;
 
class GFG {
 
    static int calculate(int[] a, int n)
    {
 
        // sort the array.
        Arrays.sort(a);
 
        int mini = a[0] + a[n - 1];
        int maxi = a[0] + a[n - 1];
 
        for (int i = 1, j = n - 1; i < j; i++, j--) {
            if (a[i] + a[j] > maxi) {
                maxi = a[i] + a[j];
            }
            if (a[i] + a[j] < mini) {
                mini = a[i] + a[j];
            }
        }
 
        return Math.abs(maxi - mini);
    }
 
    public static void main(String[] args)
    {
        int[] a = { 2, 6, 4, 3 };
        int n = a.length;
 
        System.out.print(calculate(a, n));
    }
}
 
// This code is contributed by lokesh (lokeshmvs21).
Producción

1

Complejidad de tiempo: O (n*log(n))

Espacio Auxiliar: O(1)

Preguntado en: Inmobi
Referencia: https://www.hackerearth.com/problem/algorithm/project-team/
 

Publicación traducida automáticamente

Artículo escrito por Aditya Gupta 4 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 *