Diferencia entre la suma de K elementos de array pares e impares máximos

Dada una array arr[] y un número K , la tarea es encontrar la diferencia absoluta de la suma de K elementos de array pares e impares máximos.
Nota: Al menos K elementos pares e impares están presentes en la array respectivamente.

Ejemplos:

Entrada arr[] = {1, 2, 3, 4, 5, 6}, K = 2
Salida: 2
Explicación :
Los 2 números pares máximos son 6, 4. La suma es 6 + 4 = 10.
Los 2 números impares máximos los números son 5, 3. La suma es 5 + 3 = 8.
Diferencia = 10 – 8 = 2.

Entrada arr[] = {1, 8, 4, 5, 6, 3}, K = 3
Salida: 4
Explicación :
Los 3 números pares máximos son 8, 6, 4. La suma es 8 + 6 + 4 = 18.
Los 3 números impares máximos son 5, 3, 1. La suma es 5 + 3 + 1 = 9.
Diferencia = 18 – 9 = 9.

Enfoque ingenuo: el enfoque más simple es encontrar los K números pares máximos y los K números impares máximos recorriendo la array e imprimir la diferencia absoluta entre la suma de los K elementos pares e impares máximos obtenidos. 

Complejidad temporal: O(N*K)
Espacio auxiliar: O(1)

Enfoque eficiente: para optimizar el enfoque anterior, la idea es utilizar el concepto de segregar la array en números pares e impares y luego clasificar la array en dos partes en orden descendente que contengan números pares e impares respectivamente. Siga los pasos a continuación para resolver el problema:

  • Separe el número par y el número impar en la array dada respectivamente y almacene el índice desde donde comienzan los números impares.
  • Sea K el índice de donde parten los números impares . Ordene el número en el rango [0, K – 1] y [K, N – 1] en orden decreciente.
  • La suma de los primeros K números desde el comienzo de la array y desde el punto donde comienzan los números impares es la suma de los primeros K números pares e impares máximos en la array, respectivamente.
  • Imprime la diferencia absoluta entre las sumas calculadas en el paso anterior como resultado.

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

C++

// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the absolute
// difference between sum of first K
// maximum even and odd numbers
void evenOddDiff(int a[], int n, int k)
{
    // Stores index from where odd
    // number starts
    int j = -1;
 
    // Segregate even and odd number
    for (int i = 0; i < n; i++) {
 
        // If current element is even
        if (a[i] % 2 == 0) {
            j++;
            swap(a[i], a[j]);
        }
    }
 
    j++;
 
    // Sort in decreasing order even part
    sort(a, a + j, greater<int>());
 
    // Sort in decreasing order odd part
    sort(a + j, a + n, greater<int>());
 
    int evenSum = 0, oddSum = 0;
 
    // Calculate sum of k
    // maximum even number
    for (int i = 0; i < k; i++) {
        evenSum += a[i];
    }
 
    // Calculate sum of k
    // maximum odd number
    for (int i = j; i < (j + k); i++) {
        oddSum += a[i];
    }
 
    // Print the absolute difference
    cout << abs(evenSum - oddSum);
}
 
// Driver Code
int main()
{
    // Given array arr[]
    int arr[] = { 1, 8, 3, 4, 5 };
 
    // Size of array
    int N = sizeof(arr) / sizeof(arr[0]);
 
    int K = 2;
 
    // Function Call
    evenOddDiff(arr, N, K);
 
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
 
class GFG{
 
// Function to find the absolute
// difference between sum of first K
// maximum even and odd numbers
static void evenOddDiff(int a[], int n, int k)
{
     
    // Stores index from where odd
    // number starts
    int j = -1;
     
    Vector<Integer> even = new Vector<>();
    Vector<Integer> odd = new Vector<>();
     
    // Segregate even and odd number
    for(int i = 0; i < n; i++)
    {
         
        // If current element is even
        if (a[i] % 2 == 0)
        {
            even.add(a[i]);
        }
        else
            odd.add(a[i]);
    }
 
    j++;
 
    // Sort in decreasing order even part
    Collections.sort(even);
    Collections.reverse(even);
 
    // Sort in decreasing order odd part
    Collections.sort(odd);
    Collections.reverse(odd);
 
    int evenSum = 0, oddSum = 0;
 
    // Calculate sum of k
    // maximum even number
    for(int i = 0; i < k; i++)
    {
        evenSum += even.get(i);
    }
 
    // Calculate sum of k
    // maximum odd number
    for(int i = 0; i < k; i++)
    {
        oddSum += odd.get(i);
    }
 
    // Print the absolute difference
    System.out.print(Math.abs(evenSum - oddSum));
}
 
// Driver Code
public static void main(String[] args)
{
     
    // Given array arr[]
    int arr[] = { 1, 8, 3, 4, 5 };
 
    // Size of array
    int N = arr.length;
 
    int K = 2;
 
    // Function Call
    evenOddDiff(arr, N, K);
}
}
 
// This code is contributed by Rajput-Ji

Python3

# Python3 program for the above approach
 
# Function to find the absolute
# difference between sum of first K
# maximum even and odd numbers
def evenOddDiff(a, n, k) :
      
    # Stores index from where odd
    # number starts
    j = -1
      
    even = []
    odd = []
      
    # Segregate even and odd number
    for i in range(n) :
          
        # If current element is even
        if (a[i] % 2 == 0) :
         
            even.append(a[i])
        else :
            odd.append(a[i])
  
    j += 1
  
    # Sort in decreasing order even part
    even.sort()
    even.reverse()
  
    # Sort in decreasing order odd part
    odd.sort()
    odd.reverse()
  
    evenSum, oddSum = 0, 0
  
    # Calculate sum of k
    # maximum even number
    for i in range(k) :
 
        evenSum += even[i]
      
    # Calculate sum of k
    # maximum odd number
    for i in range(k) :
     
        oddSum += odd[i]
  
    # Print the absolute difference
    print(abs(evenSum - oddSum))
     
# Given array []arr
arr = [ 1, 8, 3, 4, 5 ]
  
# Size of array
N = len(arr)
 
K = 2
 
# Function Call
evenOddDiff(arr, N, K)
 
# This code is contributed by divyeshrabadiya07

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
// Function to find the absolute
// difference between sum of first K
// maximum even and odd numbers
static void evenOddDiff(int []a, int n,
                        int k)
{
     
    // Stores index from where odd
    // number starts
    int j = -1;
     
    List<int> even = new List<int>();
    List<int> odd = new List<int>();
     
    // Segregate even and odd number
    for(int i = 0; i < n; i++)
    {
         
        // If current element is even
        if (a[i] % 2 == 0)
        {
            even.Add(a[i]);
        }
        else
            odd.Add(a[i]);
    }
 
    j++;
 
    // Sort in decreasing order even part
    even.Sort();
    even.Reverse();
 
    // Sort in decreasing order odd part
    odd.Sort();
    odd.Reverse();
 
    int evenSum = 0, oddSum = 0;
 
    // Calculate sum of k
    // maximum even number
    for(int i = 0; i < k; i++)
    {
        evenSum += even[i];
    }
     
    // Calculate sum of k
    // maximum odd number
    for(int i = 0; i < k; i++)
    {
        oddSum += odd[i];
    }
 
    // Print the absolute difference
    Console.Write(Math.Abs(evenSum - oddSum));
}
 
// Driver Code
public static void Main(String[] args)
{
     
    // Given array []arr
    int []arr = { 1, 8, 3, 4, 5 };
     
    // Size of array
    int N = arr.Length;
 
    int K = 2;
 
    // Function Call
    evenOddDiff(arr, N, K);
}
}
 
// This code is contributed by Amit Katiyar

Javascript

<script>
// javascript program for the above approach
 
    // Function to find the absolute
    // difference between sum of first K
    // maximum even and odd numbers
    function evenOddDiff(a , n , k) {
 
        // Stores index from where odd
        // number starts
        var j = -1;
 
        var even = [];
        var odd = [];
 
        // Segregate even and odd number
        for (i = 0; i < n; i++) {
 
            // If current element is even
            if (a[i] % 2 == 0) {
                even.push(a[i]);
            } else
                odd.push(a[i]);
        }
 
        j++;
 
        // Sort in decreasing order even part
        even.sort((a,b)=>a-b);
        even.reverse(even);
 
        // Sort in decreasing order odd part
        odd.sort((a,b)=>a-b);;
        odd.reverse();
 
        var evenSum = 0, oddSum = 0;
 
        // Calculate sum of k
        // maximum even number
        for (i = 0; i < k; i++) {
            evenSum += even[i];
        }
 
        // Calculate sum of k
        // maximum odd number
        for (i = 0; i < k; i++) {
            oddSum += odd[i];
        }
 
        // Print the absolute difference
        document.write(Math.abs(evenSum - oddSum));
    }
 
    // Driver Code
     
        // Given array arr
        var arr = [ 1, 8, 3, 4, 5 ];
 
        // Size of array
        var N = arr.length;
 
        var K = 2;
 
        // Function Call
        evenOddDiff(arr, N, K);
 
// This code is contributed by umadevi9616
</script>
Producción: 

4

 

Complejidad de tiempo: O(N*log N + K)
Espacio auxiliar: O(1) 

Publicación traducida automáticamente

Artículo escrito por kothawade29 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 *