K-ésimo elemento más pequeño de una array de dimensiones dadas lleno de producto de índices

Dado un entero K y una array de tamaño N x M , donde cada elemento de la array es igual al producto de sus índices ( i * j ), la tarea es encontrar el K -ésimo elemento más pequeño en la array dada.
Ejemplos:  

Entrada: N = 2, M = 3, K = 5 
Salida:
Explicación: 
La array posible para las dimensiones dadas es {{1, 2, 3}, {2, 4, 6}} 
Orden ordenado de los elementos de la array: { 1, 2, 2, 3, 4, 6} 
Por lo tanto, el quinto elemento más pequeño es 4 .
Entrada: N = 1, M = 10, K = 8 
Salida:
Explicación: 
La array posible para las dimensiones dadas es {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} 
Por lo tanto, el octavo elemento más pequeño es 8
 

Enfoque ingenuo: el enfoque más simple es almacenar todos los elementos de la array en una array y luego encontrar el K -ésimo elemento más pequeño ordenando la array. 
Complejidad de tiempo: O(N×M×log(N×M)) 
Espacio auxiliar: O(N×M)
Enfoque eficiente: 
Para optimizar el enfoque ingenuo, la idea es utilizar el algoritmo de búsqueda binaria . Siga los pasos a continuación para resolver el problema:

  1. Inicialice bajo como 1 y alto como N×M, ya que el K -ésimo elemento más pequeño se encuentra entre 1 y N×M. 
  2. Encuentre el elemento medio entre los elementos bajo y alto .
  3. Si el número de elementos menor que mid es mayor o igual a K, entonces actualice alto a mid-1 ya que el K- ésimo elemento más pequeño se encuentra entre bajo y medio.
  4. Si el número de elementos menor que mid es menor que K, actualice low to mid+1 ya que el K-ésimo elemento más pequeño se encuentra entre mid y high.
  5. Como los elementos en la i-ésima fila son múltiplos de i , el número de elementos menores que la mitad en la i-ésima fila se puede calcular fácilmente mediante min(mid/i, M). Entonces, la complejidad del tiempo para encontrar el número de elementos menor que la mitad se puede hacer solo en O(N) .
  6. Realice una búsqueda binaria hasta que low sea menor o igual que high y devuelva high + 1 como el K-ésimo elemento más pequeño de la array N×M.

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;
 
#define LL long long
 
// Function that returns true if the
// count of elements is less than mid
bool countLessThanMid(LL mid, LL N,
                    LL M, LL K)
{
    // To store count of elements
    // less than mid
    LL count = 0;
 
    // Loop through each row
    for (int i = 1;
        i <= min((LL)N, mid); ++i) {
 
        // Count elements less than
        // mid in the ith row
        count = count + min(mid / i, M);
    }
 
    if (count >= K)
        return false;
    else
        return true;
}
 
// Function that returns the Kth
// smallest element in the NxM
// Matrix after sorting in an array
LL findKthElement(LL N, LL M, LL K)
{
    // Initialize low and high
    LL low = 1, high = N * M;
 
    // Perform binary search
    while (low <= high) {
 
        // Find the mid
        LL mid = low + (high - low) / 2;
 
        // Check if the count of
        // elements is less than mid
        if (countLessThanMid(mid, N, M, K))
            low = mid + 1;
        else
            high = mid - 1;
    }
 
    // Return Kth smallest element
    // of the matrix
    return high + 1;
}
 
// Driver Code
int main()
{
    LL N = 2, M = 3;
 
    LL int K = 5;
 
    cout << findKthElement(N, M, K) << endl;
 
    return 0;
}

Java

// Java program to implement
// the above approach
class GFG{
     
// Function that returns true if the
// count of elements is less than mid
public static boolean countLessThanMid(int mid, int N,
                                       int M, int K)
{
     
    // To store count of elements
    // less than mid
    int count = 0;
 
    // Loop through each row
    for(int i = 1;
            i <= Math.min(N, mid); ++i)
    {
         
        // Count elements less than
        // mid in the ith row
        count = count + Math.min(mid / i, M);
    }
 
    if (count >= K)
        return false;
    else
        return true;
}
 
// Function that returns the Kth
// smallest element in the NxM
// Matrix after sorting in an array
public static int findKthElement(int N, int M, int K)
{
     
    // Initialize low and high
    int low = 1, high = N * M;
 
    // Perform binary search
    while (low <= high)
    {
         
        // Find the mid
        int mid = low + (high - low) / 2;
 
        // Check if the count of
        // elements is less than mid
        if (countLessThanMid(mid, N, M, K))
            low = mid + 1;
        else
            high = mid - 1;
    }
 
    // Return Kth smallest element
    // of the matrix
    return high + 1;
}
 
// Driver code
public static void main(String[] args)
{
    int N = 2, M = 3;
    int K = 5;
 
    System.out.println(findKthElement(N, M, K));
}
}
 
// This code is contributed by divyeshrabadiya07

Python3

# Python3 program for the above approach
# Function that returns true if the
# count of elements is less than mid
def countLessThanMid(mid, N, M, K):
     
    # To store count of elements
    # less than mid
    count = 0
 
    # Loop through each row
    for i in range (1, min(N, mid) + 1):
 
        # Count elements less than
        # mid in the ith row
        count = count + min(mid // i, M)
     
    if (count >= K):
        return False
    else:
        return True
 
# Function that returns the Kth
# smallest element in the NxM
# Matrix after sorting in an array
def findKthElement(N, M, K):
 
    # Initialize low and high
    low = 1
    high = N * M
 
    # Perform binary search
    while (low <= high):
 
        # Find the mid
        mid = low + (high - low) // 2
 
        # Check if the count of
        # elements is less than mid
        if (countLessThanMid(mid, N, M, K)):
            low = mid + 1
        else:
            high = mid - 1
 
    # Return Kth smallest element
    # of the matrix
    return high + 1
 
# Driver Code
if __name__ == "__main__": 
    N = 2
    M = 3
    K = 5
    print(findKthElement(N, M, K))
     
# This code is contributed by Chitranayal

C#

// C# program to implement
// the above approach
using System;
 
class GFG{
     
// Function that returns true if the
// count of elements is less than mid
public static bool countLessThanMid(int mid, int N,
                                    int M, int K)
{
     
    // To store count of elements
    // less than mid
    int count = 0;
 
    // Loop through each row
    for(int i = 1;
            i <= Math.Min(N, mid); ++i)
    {
         
        // Count elements less than
        // mid in the ith row
        count = count + Math.Min(mid / i, M);
    }
 
    if (count >= K)
        return false;
    else
        return true;
}
 
// Function that returns the Kth
// smallest element in the NxM
// Matrix after sorting in an array
public static int findKthElement(int N, int M,
                                        int K)
{
     
    // Initialize low and high
    int low = 1, high = N * M;
 
    // Perform binary search
    while (low <= high)
    {
         
        // Find the mid
        int mid = low + (high - low) / 2;
 
        // Check if the count of
        // elements is less than mid
        if (countLessThanMid(mid, N, M, K))
            low = mid + 1;
        else
            high = mid - 1;
    }
 
    // Return Kth smallest element
    // of the matrix
    return high + 1;
}
 
// Driver code
public static void Main(String[] args)
{
    int N = 2, M = 3;
    int K = 5;
 
    Console.WriteLine(findKthElement(N, M, K));
}
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
// Javascript program for the above approach
 
// Function that returns true if the
// count of elements is less than mid
function countLessThanMid(mid, N, M, K)
{
    // To store count of elements
    // less than mid
    let count = 0;
 
    // Loop through each row
    for (let i = 1;
        i <= Math.min(N, mid); ++i) {
 
        // Count elements less than
        // mid in the ith row
        count = count + Math.min(parseInt(mid / i), M);
    }
 
    if (count >= K)
        return false;
    else
        return true;
}
 
// Function that returns the Kth
// smallest element in the NxM
// Matrix after sorting in an array
function findKthElement(N, M, K)
{
    // Initialize low and high
    let low = 1, high = N * M;
 
    // Perform binary search
    while (low <= high) {
 
        // Find the mid
        let mid = low + parseInt((high - low) / 2);
 
        // Check if the count of
        // elements is less than mid
        if (countLessThanMid(mid, N, M, K))
            low = mid + 1;
        else
            high = mid - 1;
    }
 
    // Return Kth smallest element
    // of the matrix
    return high + 1;
}
 
// Driver Code
    let N = 2, M = 3;
 
    let K = 5;
 
    document.write(findKthElement(N, M, K));
 
</script>

Producción: 

4

Complejidad de tiempo: O(N×log(N×M)) 
Espacio auxiliar: O(1) 

Publicación traducida automáticamente

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