K-ésima suma del par más pequeño en una array dada

Dada una array de números enteros arr[] de tamaño N y un número entero K , la tarea es encontrar la K-ésima suma del par más pequeño de la array dada.

Ejemplos: 

Entrada: arr[] = {1, 5, 6, 3, 2}, K = 3
Salida: 5
Explicación: La suma de todos los pares es: 1+5 = 6, 1+6 = 7, 1+3 = 4, 1+2 = 3, 5+6 = 11, 5+3 = 8, 5+2 = 7, 6+3 = 9, 6+2 = 8, 2+3 = 5. El tercero más pequeño entre estos es 5.

Entrada: arr[] = {2, 4, 5, 6}, K = 6
Salida: 11

 

Enfoque ingenuo: Este es un enfoque codicioso . Obtendremos las sumas de todos los pares posibles y los almacenaremos en una array. Luego ordenaremos esa array en orden ascendente y el valor K-th es la respuesta requerida.
Complejidad de Tiempo: O (N 2 * log(N 2 ))
Espacio Auxiliar: O(N 2 )

Enfoque eficiente: el concepto de este enfoque se basa en max-heap . Implementaremos un montón máximo de tamaño K. Siga los pasos que se mencionan a continuación:

  • Comience a iterar la array desde i = 0 hasta i = N-2 .
    • Para cada iteración de j = i+1 a j = N-1 .
    • Obtenga la suma de este par (i, j) e insértelo en el montón máximo .
    • Si el montón está lleno , compare el elemento superior del montón con esta suma .
    • Si el valor del elemento superior es mayor , reemplácelo con la nueva suma .
  • Cuando la iteración finaliza, el elemento superior del montón máximo es la K-ésima suma del par más pequeño .

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

C++

#include <bits/stdc++.h>
using namespace std;
 
// Function to get the Kth smallest pair sum
int kthPairSum(vector<int>& arr, int K)
{
    int n = arr.size();
 
    // Priority queue to implement max-heap
    priority_queue<int> pq;
 
    // Loop to calculate all possible pair sum
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
 
            // Variable to store the sum
            int temp = arr[i] + arr[j];
 
            // If the heap is full
            if (pq.size() == K) {
 
                // If the top element is greater
                if (pq.top() > temp) {
                    pq.pop();
                    pq.push(temp);
                }
            }
            else
                pq.push(temp);
        }
    }
 
    // Return the Kth smallest value
    return pq.top();
}
 
// Driver code
int main()
{
    vector<int> arr = { 1, 5, 6, 3, 2 };
    int K = 3;
 
    cout << kthPairSum(arr, K);
    return 0;
}

Java

// Java code for the above approach
import java.util.*;
class GFG {
 
    // Function to get the Kth smallest pair sum
    static int kthPairSum(int[] arr, int K)
    {
        int n = arr.length;
 
        // Priority queue to implement max-heap
        // Creating empty priority queue
        PriorityQueue<Integer> pq
            = new PriorityQueue<Integer>(
                Collections.reverseOrder());
 
        // Loop to calculate all possible pair sum
        for (int i = 0; i < n - 1; i++) {
            for (int j = i + 1; j < n; j++) {
 
                // Variable to store the sum
                int temp = arr[i] + arr[j];
 
                // If the heap is full
                if (pq.size() == K) {
 
                    // If the top element is greater
                    if (pq.peek() > temp) {
                        pq.poll();
                        pq.add(temp);
                    }
                }
                else
                    pq.add(temp);
            }
        }
 
        // Return the Kth smallest value
        return pq.peek();
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int[] arr = { 1, 5, 6, 3, 2 };
        int K = 3;
 
        System.out.println(kthPairSum(arr, K));
    }
}
 
// This code is contributed by Potta Lokesh

Python3

from queue import PriorityQueue
 
# Function to get the Kth smallest pair sum
def kthPairSum(arr, K):
    n = len(arr);
 
    # Priority queue to implement max-heap
    pq = PriorityQueue()
 
    # Loop to calculate all possible pair sum
    for i in range(n - 1):
        for j in range(i + 1, n):
 
            # Variable to store the sum
            temp = arr[i] + arr[j];
 
            # If the heap is full
            if (pq.qsize() == K):
 
                # If the top element is greater
                if (pq.queue[-1] > temp):
                    pq.get();
                    pq.put(temp);
            else:
                pq.put(temp);
 
    # Return the Kth smallest value
    return pq.queue[0];
 
# Driver code
arr = [ 1, 5, 6, 3, 2 ];
K = 3;
 
print(kthPairSum(arr, K));
 
# This code is contributed by saurabh_jaiswal.

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG
{
    // Function to get the Kth smallest pair sum
    static int kthPairSum(int[] arr, int K)
    {
        int n = arr.Length;
 
        // Priority queue to implement max-heap
        // Creating empty priority queue
        List<int> pq = new List<int>();
 
        // Loop to calculate all possible pair sum
        for (int i = 0; i < n - 1; i++) {
            for (int j = i + 1; j < n; j++) {
 
                // Variable to store the sum
                int temp = arr[i] + arr[j];
 
                // If the heap is full
                if (pq.Count  == K) {
 
                    // If the top element is greater
                    if (pq[0] > temp) {
                        pq.Remove(0);
                        pq.Add(temp);
                    }
                }
                else
                    pq.Add(temp);
                 
            }
        }
 
        // Return the Kth smallest value
        return pq[0]-1;
    }
 
// Driver Code
public static void Main()
{
    int[] arr = { 1, 5, 6, 3, 2 };
    int K = 3;
 
    Console.Write(kthPairSum(arr, K));
}
}
 
// This code is contributed by avijitmondal1998.

Javascript

<script>
// Javascript code for the above approach
 
// Function to get the Kth smallest pair sum
function kthPairSum(arr, K)
{
    let n = arr.length;
 
    // Priority queue to implement max-heap
    pq = [];
 
    // Loop to calculate all possible pair sum
    for (let i = 0; i < n - 1; i++) {
        for (let j = i + 1; j < n; j++) {
 
            // Variable to store the sum
            let temp = arr[i] + arr[j];
 
            // If the heap is full
            if (pq.length == K) {
 
                // If the top element is greater
                if (pq[0] > temp) {
                    pq.shift();
                    pq.push(temp);
                    pq.sort((a, b) => b - a);
                }
            }
            else
                {pq.push(temp);
                pq.sort((a, b) => b - a);}
                 
        }
    }
 
    // Return the Kth smallest value
    return pq[0];
}
 
// Driver code
 
    let arr = [ 1, 5, 6, 3, 2 ];
    let K = 3;
 
    document.write(kthPairSum(arr, K));
 
// This code is contributed by Pushpesh raj
</script>
Producción

5

Complejidad de Tiempo: O(N 2 * logK)
Espacio Auxiliar: O(K)

Publicación traducida automáticamente

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