Consultas por número de elementos a derecha e izquierda

Dado Q consultas de tres tipos donde cada consulta consta de un número. 
 

  1. Agregar número de elemento a la izquierda
  2. Agregar número de elemento a la derecha
  3. Imprime el número de elementos a la derecha y a la izquierda del número de elemento dado .

La tarea es escribir un programa que realice las consultas anteriores. 
Nota: Los elementos de las consultas 1 y 2 son distintos y 0 <= num <= 10 5
Ejemplos: 
 

Entrada: 
Q = 5 
Consulta de tipo 1: num = 3 
Consulta de tipo 2: num = 5 
Consulta de tipo 1: num = 2 
Consulta de tipo 1: num = 4 
Consulta de tipo 3: num = 3 
Salida: elemento en el derecha: 1 elemento a la izquierda: 2 
Después de la consulta 1, el posicionamiento del elemento es 3 
Después de la consulta 2, el posicionamiento del elemento es 35 
Después de la consulta 3, el posicionamiento del elemento es 235 
Después de la consulta 4, el posicionamiento del elemento es 4235 
Así que hay 1 elemento a la derecha y 2 elementos a la izquierda de 3 cuando 
se llama a la consulta 3. 
 

Se pueden seguir los siguientes pasos para resolver el problema anterior. 
 

  • Inicialice una variable izquierda y derecha como 0, y dos arrays hash position[] y mark[] . position[] se usa para almacenar el índice de num a la izquierda y a la derecha y mark[] se usa para marcar si el num está a la izquierda o a la derecha.
  • Para la consulta 1, aumente el recuento de la izquierda y marque la posición [num] como izquierda y marque [num] como 1.
  • Para la consulta 2, aumente el recuento de la derecha y marque la posición [num] como derecha y marque [num] como 2
  • Para la consulta-3, verifique si el número dado está presente a la derecha o a la izquierda usando la marca [].
  • Si el número está presente a la derecha, entonces el número de elementos a la izquierda de num será (posición-izquierda[num]) , y el número de elementos a la derecha de num será (posición[num] – 1 + derecha ) .
  • Si el número está presente a la izquierda, entonces el número de elementos a la derecha de num será (right-position[num]) , y el número de elementos a la izquierda de num será (position[num] – 1 + * izquierda) .

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

CPP

// C++ program to print the number of elements
// on right and left of a given element
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100005
 
// function to perform query 1
void performQueryOne(int num, int* left, int* right,
                     int* position, int* mark)
{
    // count number of elements on left
    *left = *left + 1;
 
    // store the index number
    position[num] = *(left);
 
    // mark the element is on left
    mark[num] = 1;
}
 
// function to perform query 2
void performQueryTwo(int num, int* left, int* right,
                     int* position, int* mark)
{
    // count number of elements on right
    *right = *right + 1;
 
    // store the index number
    position[num] = *(right);
 
    // mark the element is on right
    mark[num] = 2;
}
 
// function to perform query 3
void performQueryThree(int num, int* left, int* right,
                       int* position, int* mark)
{
    int toright, toleft;
 
    // if the element is on right
    if (mark[num] == 2) {
        toright = *right - position[num];
        toleft = position[num] - 1 + *left;
    }
 
    // if the element is on left
    else if (mark[num] == 1) {
        toleft = *left - position[num];
        toright = position[num] - 1 + *right;
    }
 
    // not present
    else {
        cout << "The number is not there\n";
        return;
    }
 
    cout << "The number of elements to right of "
         << num << ": " << toright;
 
    cout << "\nThe number of elements to left of "
         << num << ": " << toleft;
}
 
// Driver Code
int main()
{
 
    int left = 0, right = 0;
 
    // hashing arrays
    int position[MAXN] = { 0 };
    int mark[MAXN] = { 0 };
 
    int num = 3;
 
    // query type-1
    performQueryOne(num, &left, &right, position, mark);
 
    // query type-2
    num = 5;
    performQueryTwo(num, &left, &right, position, mark);
 
    // query type-2
    num = 2;
    performQueryOne(num, &left, &right, position, mark);
 
    // query type-2
    num = 4;
    performQueryOne(num, &left, &right, position, mark);
 
    // query type-3
    num = 3;
    performQueryThree(num, &left, &right, position, mark);
 
    return 0;
}

Javascript

<script>
    // JavaScript program to print the number of elements
    // on right and left of a given element
    const MAXN = 100005;
 
    let left = 0, right = 0;
 
    // hashing arrays
    let position = new Array(MAXN).fill(0);
    let mark = new Array(MAXN).fill(0);
 
    // function to perform query 1
    const performQueryOne = (num) => {
     
        // count number of elements on left
        left = left + 1;
 
        // store the index number
        position[num] = left;
 
        // mark the element is on left
        mark[num] = 1;
    }
 
    // function to perform query 2
    const performQueryTwo = (num) => {
     
        // count number of elements on right
        right = right + 1;
 
        // store the index number
        position[num] = right;
 
        // mark the element is on right
        mark[num] = 2;
    }
 
    // function to perform query 3
    const performQueryThree = (num) => {
        let toright, toleft;
 
        // if the element is on right
        if (mark[num] == 2) {
            toright = right - position[num];
            toleft = position[num] - 1 + left;
        }
 
        // if the element is on left
        else if (mark[num] == 1) {
            toleft = left - position[num];
            toright = position[num] - 1 + right;
        }
 
        // not present
        else {
            document.write("The number is not there<br/>");
            return;
        }
 
        document.write(`The number of elements to right of ${num}: ${toright}`);
 
        document.write(`<br/>The number of elements to left of ${num}: ${toleft}`);
    }
 
    // Driver Code
    let num = 3;
 
    // query type-1
    performQueryOne(num);
 
    // query type-2
    num = 5;
    performQueryTwo(num);
 
    // query type-2
    num = 2;
    performQueryOne(num);
 
    // query type-2
    num = 4;
    performQueryOne(num);
 
    // query type-3
    num = 3;
    performQueryThree(num);
 
// This code is contributed by rakeshsahni
 
</script>
The number of elements to right of 3: 1
The number of elements to left of 3: 2

Complejidad de Tiempo: O(1) para cada consulta. 

Espacio Auxiliar: O(MAXN), donde MAXN es 10 5 .

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 *