Índice más pequeño en un rango dado de índices que no es igual a X

Dada una array de enteros arr[] de tamaño N y Q consultas de la forma {L, R, X} , la tarea es encontrar el índice más pequeño entre L y R de la array dada tal que arr[i] != X. _ Si no existe tal índice en la array, imprima -1 .

Ejemplos:

Entrada: arr[] = {1, 2, 1, 1, 3, 5}, consulta[][] = {{0, 3, 1}, {1, 5, 2}, {2, 3, 1} } 
Salida:

-1 
Explicación: 
El primer índice del 0 al 3 que no contiene 1 es 1 
El primer índice del 1 al 5 que no contiene 2 es 2 
Todos los índices del 2 al 3 contienen 1. Por lo tanto, el la respuesta es -1

Entrada: arr[] = { 1, 2, 3, 2, 1, 1, 3, 5}, consulta[][] = { { 1, 4, 2 }, { 4, 5, 1 }, { 2, 3, 1 }, { 4, 6, 1 }} 
Salida:
-1 

Enfoque ingenuo: 
itere sobre el rango [L, R] para cada consulta y verifique si existe algún índice que no contenga X . Si se encuentra dicho índice, imprima ese índice. De lo contrario, imprima -1

Complejidad Temporal: O (N * Q)  
Espacio Auxiliar: O (1)

Enfoque eficiente: 
el enfoque anterior se puede optimizar aún más precomputando y almacenando el índice del siguiente elemento que es diferente del elemento actual, para cada elemento de la array, lo que reduce la complejidad computacional a O(1) para cada consulta. 
Siga los pasos a continuación para resolver el problema: 

  1. Cree una array auxiliar nextpos[] para almacenar para cada elemento de la array, el índice del siguiente elemento que es diferente del elemento actual.
  2. Ahora, para procesar cada consulta, primero verifique si el valor en el índice L no es igual a X. Si es así , entonces la respuesta será L.
  3. De lo contrario, significa que arr[L] = X . En este caso, necesitamos encontrar el siguiente índice que tenga un valor diferente de arr[L] . Esto se puede obtener de nextpos[L] .
  4. Si nextpos[L] es menor que igual a R , imprima nexpos[L].
  5. Si no se cumple ninguna de las condiciones anteriores, la respuesta será -1 .

Ilustración: 

arr[] = {1, 2, 1, 1, 3, 5}, consulta[][] = {{0, 3, 1}, {1, 5, 2}, {2, 3, 1}} 
Para la array dada arr[], nextpos[] será {1, 2, 4, 4, 5, 6} 
Para la primera consulta: L = 0, R = 3, X = 1 
arr[0] = 1 = X 
nextpos[ 0] = 1( < 3) 
Por lo tanto, la respuesta es 1.
Para la segunda consulta: L = 1, R = 5, X = 2 
arr[1] = 2( = X) 
nextpos[1] = 2( < 5 ) 
Por lo tanto, la respuesta es 2.
Para la tercera consulta: L = 2, R = 3, X = 1 
arr[2] = 1( = X) 
nextpos[2] = 4( > R) 
Por lo tanto, la respuesta es – 1 

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

C++

// C++ Program to find the smallest
// index in the array in the range
// [L, R] which does not contain X
 
#include <bits/stdc++.h>
using namespace std;
 
// Precompute the index of next
// different element in the array
// for every array element
void precompute(int nextpos[], int arr[],
                int N)
{
    // Default value
    nextpos[N - 1] = N;
 
    for (int i = N - 2; i >= 0; i--) {
 
        // Compute nextpos[i] using
        // nextpos[i+1]
        if (arr[i] == arr[i + 1])
            nextpos[i] = nextpos[i + 1];
        else
            nextpos[i] = i + 1;
    }
}
// Function to return the smallest index
void findIndex(int query[][3], int arr[],
               int N, int Q)
{
    // nextpos[i] will store the next
    // position p where arr[p]!=arr[i]
    int nextpos[N];
    precompute(nextpos, arr, N);
 
    for (int i = 0; i < Q; i++) {
        int l, r, x;
        l = query[i][0];
        r = query[i][1];
        x = query[i][2];
 
        int ans = -1;
 
        // If X is not present at l
        if (arr[l] != x)
            ans = l;
 
        // Otherwise
        else {
 
            // Find the index which
            // stores a value different
            // from X
            int d = nextpos[l];
 
            // If that index is within
            // the range
            if (d <= r)
                ans = d;
        }
        cout << ans << "\n";
    }
}
// Driver Code
int main()
{
    int N, Q;
    N = 6;
    Q = 3;
    int arr[] = { 1, 2, 1, 1, 3, 5 };
    int query[Q][3] = { { 0, 3, 1 },
                        { 1, 5, 2 },
                        { 2, 3, 1 } };
 
    findIndex(query, arr, N, Q);
 
    return 0;
}

Java

// Java program to find the smallest
// index in the array in the range
// [L, R] which does not contain X
class GFG{
 
// Precompute the index of next
// different element in the array
// for every array element
static void precompute(int nextpos[], int arr[],
                       int N)
{
     
    // Default value
    nextpos[N - 1] = N;
 
    for(int i = N - 2; i >= 0; i--)
    {
         
       // Compute nextpos[i] using
       // nextpos[i+1]
       if (arr[i] == arr[i + 1])
           nextpos[i] = nextpos[i + 1];
       else
           nextpos[i] = i + 1;
    }
}
 
// Function to return the smallest index
static void findIndex(int query[][], int arr[],
                      int N, int Q)
{
     
    // nextpos[i] will store the next
    // position p where arr[p]!=arr[i]
    int []nextpos = new int[N];
    precompute(nextpos, arr, N);
 
    for(int i = 0; i < Q; i++)
    {
       int l, r, x;
       l = query[i][0];
       r = query[i][1];
       x = query[i][2];
        
       int ans = -1;
        
       // If X is not present at l
       if (arr[l] != x)
           ans = l;
            
       // Otherwise
       else
       {
            
           // Find the index which
           // stores a value different
           // from X
           int d = nextpos[l];
            
           // If that index is within
           // the range
           if (d <= r)
               ans = d;
       }
       System.out.print(ans + "\n");
    }
}
 
// Driver Code
public static void main(String[] args)
{
    int N, Q;
    N = 6;
    Q = 3;
 
    int arr[] = { 1, 2, 1, 1, 3, 5 };
    int query[][] = { { 0, 3, 1 },
                      { 1, 5, 2 },
                      { 2, 3, 1 } };
 
    findIndex(query, arr, N, Q);
}
}
 
// This code is contributed by Amit Katiyar

Python3

# Python3 program to find the smallest
# index in the array in the range
# [L, R] which does not contain X
 
# Precompute the index of next
# different element in the array
# for every array element
 
def precompute(nextpos, arr, N):
 
    # Default value
    nextpos[N - 1] = N
   
    for i in range(N - 2, -1, -1):
   
        # Compute nextpos[i] using
        # nextpos[i+1]
        if arr[i] == arr[i + 1]:
            nextpos[i] = nextpos[i + 1]
        else:
            nextpos[i] = i + 1
 
# Function to return the smallest index
def findIndex(query, arr, N, Q):
 
    # nextpos[i] will store the next
    # position p where arr[p]!=arr[i]
    nextpos = [0] * N
    precompute(nextpos, arr, N)
   
    for i in range(Q):
        l = query[i][0]
        r = query[i][1]
        x = query[i][2]
   
        ans = -1
   
        # If X is not present at l
        if arr[l] != x:
            ans = l
   
        # Otherwise
        else:
   
            # Find the index which
            # stores a value different
            # from X
            d = nextpos[l]
   
            # If that index is within
            # the range
            if d <= r:
                ans = d
         
        print(ans)
         
# Driver code     
N = 6
Q = 3
arr = [ 1, 2, 1, 1, 3, 5 ]
query = [ [ 0, 3, 1 ],
          [ 1, 5, 2 ],
          [ 2, 3, 1 ] ]
 
findIndex(query, arr, N, Q)
 
# This code is contributed by divyeshrabadiya07

C#

// C# program to find the smallest
// index in the array in the range
// [L, R] which does not contain X
using System;
 
class GFG{
 
// Precompute the index of next
// different element in the array
// for every array element
static void precompute(int []nextpos,
                       int []arr, int N)
{
     
    // Default value
    nextpos[N - 1] = N;
 
    for(int i = N - 2; i >= 0; i--)
    {
         
        // Compute nextpos[i] using
        // nextpos[i+1]
        if (arr[i] == arr[i + 1])
            nextpos[i] = nextpos[i + 1];
        else
            nextpos[i] = i + 1;
    }
}
 
// Function to return the smallest index
static void findIndex(int [,]query, int []arr,
                      int N, int Q)
{
     
    // nextpos[i] will store the next
    // position p where arr[p]!=arr[i]
    int []nextpos = new int[N];
    precompute(nextpos, arr, N);
 
    for(int i = 0; i < Q; i++)
    {
        int l, r, x;
        l = query[i, 0];
        r = query[i, 1];
        x = query[i, 2];
             
        int ans = -1;
             
        // If X is not present at l
        if (arr[l] != x)
            ans = l;
                 
        // Otherwise
        else
        {
                 
            // Find the index which
            // stores a value different
            // from X
            int d = nextpos[l];
                 
            // If that index is within
            // the range
            if (d <= r)
                ans = d;
        }
        Console.Write(ans + "\n");
    }
}
 
// Driver Code
public static void Main(String[] args)
{
    int N, Q;
    N = 6;
    Q = 3;
 
    int []arr = { 1, 2, 1, 1, 3, 5 };
    int [,]query = { { 0, 3, 1 },
                     { 1, 5, 2 },
                     { 2, 3, 1 } };
 
    findIndex(query, arr, N, Q);
}
}
 
// This code is contributed by Amit Katiyar

Javascript

<script>
  
 
// Javascript Program to find the smallest
// index in the array in the range
// [L, R] which does not contain X
 
// Precompute the index of next
// different element in the array
// for every array element
function precompute(nextpos, arr, N)
{
    // Default value
    nextpos[N - 1] = N;
 
    for (var i = N - 2; i >= 0; i--) {
 
        // Compute nextpos[i] using
        // nextpos[i+1]
        if (arr[i] == arr[i + 1])
            nextpos[i] = nextpos[i + 1];
        else
            nextpos[i] = i + 1;
    }
}
// Function to return the smallest index
function findIndex(query, arr, N, Q)
{
    // nextpos[i] will store the next
    // position p where arr[p]!=arr[i]
    var nextpos = Array(N);
    precompute(nextpos, arr, N);
 
    for (var i = 0; i < Q; i++) {
        var l, r, x;
        l = query[i][0];
        r = query[i][1];
        x = query[i][2];
 
        var ans = -1;
 
        // If X is not present at l
        if (arr[l] != x)
            ans = l;
 
        // Otherwise
        else {
 
            // Find the index which
            // stores a value different
            // from X
            var d = nextpos[l];
 
            // If that index is within
            // the range
            if (d <= r)
                ans = d;
        }
        document.write( ans + "<br>");
    }
}
// Driver Code
var N, Q;
N = 6;
Q = 3;
var arr = [1, 2, 1, 1, 3, 5];
var query = [ [ 0, 3, 1 ],
                    [ 1, 5, 2 ],
                    [ 2, 3, 1 ] ];
findIndex(query, arr, N, Q);
 
</script>
Producción: 

1
2
-1

 

Complejidad temporal: O(N)  
Espacio auxiliar: O(N)
 

Publicación traducida automáticamente

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