Encuentre la secuencia lexicográficamente más pequeña que se puede formar reorganizando elementos de la segunda array

Dadas dos arrays A y B de N enteros. Reordenar los elementos de B en sí mismo de tal manera que la secuencia formada por (A[i] + B[i]) % N después de reordenar sea la más pequeña lexicográficamente. La tarea es imprimir la secuencia  lexicográficamente más pequeña posible.
Nota : Los elementos de la array están en el rango [0, n).
Ejemplos: 
 

Entrada: a[] = {0, 1, 2, 1}, b[] = {3, 2, 1, 1} 
Salida: 1 0 0 2 
Reordenar B a {1, 3, 2, 1} para obtener el secuencia más pequeña posible. 
Entrada: a[] = {2, 0, 0}, b[] = {1, 0, 2} 
Salida: 0 0 2 
 

Enfoque: El problema se puede resolver con avidez . Inicialmente, mantenga un recuento de todos los números de la array B usando hashing, y guárdelos en el conjunto en C++ , de modo que las operaciones lower_bound() [ Para verificar un elemento ] y erase() [ Para borrar un elemento ] se puedan realizar en tiempo logarítmico. 
Para cada elemento de la array, busque un número igual o mayor que na[i] usando la función lower_bound . Si no existen tales elementos, tome el elemento más pequeño del conjunto. Disminuya el valor en 1 en la tabla hash para el número utilizado, si el valor de la tabla hash es 0, también borre el elemento del conjunto.
Sin embargo, hay una excepción si el elemento de la array es 0, luego verifique si hay 0 al principio y luego si N, si ninguno de los dos está allí, luego tome el elemento más pequeño. 
A continuación se muestra la implementación del enfoque anterior: 
 

CPP

// C++ implementation of the
// above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to get the smallest
// sequence possible
void solve(int a[], int b[], int n)
{
 
    // Hash-table to count the
    // number of occurrences of b[i]
    unordered_map<int, int> mpp;
 
    // Store the element in sorted order
    // for using binary search
    set<int> st;
 
    // Iterate in the B array
    // and count the occurrences and
    // store in the set
    for (int i = 0; i < n; i++) {
        mpp[b[i]]++;
        st.insert(b[i]);
    }
 
    vector<int> sequence;
 
    // Iterate for N elements
    for (int i = 0; i < n; i++) {
 
        // If the element is 0
        if (a[i] == 0) {
 
            // Find the nearest number to 0
            auto it = st.lower_bound(0);
            int el = *it;
            sequence.push_back(el % n);
 
            // Decrease the count
            mpp[el]--;
 
            // Erase if no more are there
            if (!mpp[el])
                st.erase(el);
        }
 
        // If the element is other than 0
        else {
 
            // Find the difference
            int x = n - a[i];
 
            // Find the nearest number which can give us
            // 0 on modulo
            auto it = st.lower_bound(x);
 
            // If no such number occurs then
            // find the number closest to 0
            if (it == st.end())
                it = st.lower_bound(0);
 
            // Get the number
            int el = *it;
 
            // store the number
            sequence.push_back((a[i] + el) % n);
 
            // Decrease the count
            mpp[el]--;
 
            // If no more appears, then erase it from set
            if (!mpp[el])
                st.erase(el);
        }
    }
 
    for (auto it : sequence)
        cout << it << " ";
}
 
// Driver Code
int main()
{
    int a[] = { 0, 1, 2, 1 };
    int b[] = { 3, 2, 1, 1 };
    int n = sizeof(a) / sizeof(a[0]);
    solve(a, b, n);
    return 0;
}
Producción: 

1 0 0 2

 

Complejidad de tiempo: O(n)

Espacio Auxiliar: O(n)

Publicación traducida automáticamente

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