Compruebe para cada subarreglo si consta de todos los números naturales hasta su longitud o no

Dada una array , arr[] que representa una permutación de los primeros N números naturales en el rango [1, N] , la tarea para cada i -ésimo índice es comprobar si existe o no un subarreglo de i-longitud que contenga todos los números en el rango [1, i]
Nota: 1: indexación basada en uso.

Ejemplos:

Entrada: arr[] = {4, 5, 1, 3, 2}
Salida : Verdadero Falso Verdadero Falso Verdadero
Explicación
Para i = 1, el subarreglo {arr[2]} contiene todos los números de [1, i] y de tamaño i(=1). Por lo tanto, la salida requerida es verdadera. 
Para i = 2, no existe ningún subarreglo de tamaño 2 que contenga todos los números en el rango [1, i]. Por lo tanto, la salida requerida es falsa. 
Para i = 3, el subarreglo {arr[2], arr[3], arr[4]} contiene todos los números de [1, i] y de tamaño i(=3). Por lo tanto, la salida requerida es verdadera. 
Para i = 4, no existe ningún subarreglo de tamaño 4 que contenga todos los números en el rango [1, i]. Por lo tanto, la salida requerida es falsa. 
Para i = 5, el subarreglo {arr[0], arr[1], arr[2], arr[3], arr[4]} contiene todos los números de [1, i] y de tamaño i(=5 ). Por lo tanto, la salida requerida es verdadera. 

Entrada: arr = {1, 4, 3, 2}
Salida: Verdadero Falso Falso Verdadero

Enfoque ingenuo: la idea es recorrer la array y, para cada índice, verificar si hay una subarreglo de tamaño i que contiene todos los números en el rango [1, i] o no. Si se encuentra que es verdadero, imprima Verdadero . De lo contrario, escriba Falso. 

Tiempo Complejidad: O(N 2 )  
Espacio Auxiliar: O(N)

Enfoque eficiente: el problema se puede resolver utilizando Hashing para almacenar la posición de cada elemento de la array dada de manera eficiente. Siga los pasos a continuación para resolver el problema:

  • Cree un mapa , digamos, Mapa , para almacenar la posición de cada elemento de la array dada.
  • Atraviese la array y almacene la posición de cada elemento de la array en Map .
  • Cree un conjunto , digamos st para almacenar los índices de cada elemento del rango [1, N] .
  • Inicialice dos variables, digamos Min y Max , para almacenar los elementos más pequeños y más grandes presentes en st .
  • Itere sobre el rango [1, N] e inserte el valor de Map[i] en st y verifique si Max – Min + 1 = i o no. Si se encuentra que es verdadero, imprima Verdadero .
  • De lo contrario, imprime Falso .

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

C++

// C++ program to implement
// the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to check if a subarray of size i exists
// that contain all the numbers in the range [1, i]
void checksubarrayExist1_N(int arr[], int N)
{
 
    // Store the position
    // of each element of arr[]
    unordered_map<int, int> pos;
 
    // Traverse the array
    for (int i = 0; i < N; i++) {
 
        // Insert the position
        // of arr[i]
        pos[arr[i]] = i;
    }
 
    // Store position of each element
    // from the range [1, N]
    set<int> st;
 
    // Iterate over the range [1, N]
    for (int i = 1; i <= N; i++) {
 
        // Insert the index of i into st
        st.insert(pos[i]);
        // Find the smallest element of st
        int Min = *(st.begin());
 
        // Find the largest element of st
        int Max = *(st.rbegin());
 
        // If distance between the largest
        // and smallest element of arr[]
        // till i-th index is equal to i
        if (Max - Min + 1 == i) {
            cout << "True ";
        }
        else {
            cout << "False ";
        }
    }
}
 
// Driver Code
int main()
{
    int arr[] = { 1, 4, 3, 2 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    checksubarrayExist1_N(arr, N);
}

Java

// Java program to implement
// the above approach
import java.util.*;
 
class GFG {
 
  // Function to check if a subarray of size i exists
  // that contain all the numbers in the range [1, i]
  static void checksubarrayExist1_N(int arr[], int N)
  {
 
    // Store the position
    // of each element of arr[]
    Map<Integer, Integer> pos=new HashMap<>();
 
    // Traverse the array
    for (int i = 0; i < N; i++) {
 
      // Insert the position
      // of arr[i]
      pos.put(arr[i],i);
    }
 
    // Store position of each element
    // from the range [1, N]
    Set<Integer> st=new HashSet<>();
 
    // Iterate over the range [1, N]
    for (int i = 1; i <= N; i++) {
 
      // Insert the index of i into st
      st.add(pos.get(i));
      // Find the smallest element of st
      int Min = Collections.min(st);
 
      // Find the largest element of st
      int Max = Collections.max(st);
 
      // If distance between the largest
      // and smallest element of arr[]
      // till i-th index is equal to i
      if (Max - Min + 1 == i) {
        System.out.print("True ");
      }
      else {
        System.out.print("False ");
      }
    }
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int arr[] = { 1, 4, 3, 2 };
    int N = arr.length;
 
    checksubarrayExist1_N(arr, N);
  }
}
// This code is contributed by offbeat

Python3

# Python3 program to implement
# the above approach
 
# Function to check if a subarray of size i exists
# that contain all the numbers in the range [1, i]
def checksubarrayExist1_N(arr, N):
 
    # Store the position
    # of each element of arr[]
    pos = {}
 
    # Traverse the array
    for i in range(N):
       
        # Insert the position
        # of arr[i]
        pos[arr[i]] = i
 
    # Store position of each element
    # from the range [1, N]
    st = {}
 
    # Iterate over the range [1, N]
    for i in range(1, N + 1):
 
        # Insert the index of i into st
        st[pos[i]] = 1
 
        # Find the smallest element of st
        Min = sorted(list(st.keys()))[0]
 
        # Find the largest element of st
        Max = sorted(list(st.keys()))[-1]
 
        # If distance between the largest
        # and smallest element of arr[]
        # till i-th index is equal to i
        if (Max - Min + 1 == i):
            print("True", end = " ")
        else:
            print("False", end = " ")
 
# Driver Code
if __name__ == '__main__':
    arr = [1, 4, 3, 2]
    N = len(arr)
    checksubarrayExist1_N(arr, N)
 
    # This code is contributed by mohit kumar 29.

C#

// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
using System.Linq;
 
class GFG{
 
// Function to check if a subarray of size i exists
// that contain all the numbers in the range [1, i]
static void checksubarrayExist1_N(int[] arr, int N)
{
     
    // Store the position
    // of each element of arr[]
    Dictionary<int,
               int> pos = new Dictionary<int,
                                         int>();
 
    // Traverse the array
    for(int i = 0; i < N; i++)
    {
         
        // Insert the position
        // of arr[i]
        pos[arr[i]] = i;
    }
 
    // Store position of each element
    // from the range [1, N]
    HashSet<int> st = new HashSet<int>();
 
    // Iterate over the range [1, N]
    for(int i = 1; i <= N; i++)
    {
         
        // Insert the index of i into st
        st.Add(pos[i]);
        // Find the smallest element of st
        int Min = st.Min();
 
        // Find the largest element of st
        int Max = st.Max();
 
        // If distance between the largest
        // and smallest element of arr[]
        // till i-th index is equal to i
        if (Max - Min + 1 == i)
        {
            Console.Write("True ");
        }
        else
        {
            Console.Write("False ");
        }
    }
}
 
// Driver code
public static void Main(string[] args)
{
    int[] arr = { 1, 4, 3, 2 };
    int N = arr.Length;
 
    checksubarrayExist1_N(arr, N);
}
}
 
// This code is contributed by ukasp

Javascript

<script>
 
// JavaScript program for the above approach
 
  // Function to check if a subarray of size i exists
  // that contain all the numbers in the range [1, i]
  function checksubarrayExist1_N(arr, N)
  {
  
    // Store the position
    // of each element of arr[]
    let pos = new Map();
  
    // Traverse the array
    for (let i = 0; i < N; i++) {
  
      // Insert the position
      // of arr[i]
      pos.set(arr[i],i);
    }
  
    // Store position of each element
    // from the range [1, N]
    let st=new Set();
  
    // Iterate over the range [1, N]
    for (let i = 1; i <= N; i++) {
  
      // Insert the index of i into st
      st.add(pos.get(i));
      // Find the smallest element of st
      let Min = Math.min(...st);
  
      // Find the largest element of st
      let Max = Math.max(...st);
  
      // If distance between the largest
      // and smallest element of arr[]
      // till i-th index is equal to i
      if (Max - Min + 1 == i) {
        document.write("True ");
      }
      else {
        document.write("False ");
      }
    }
  }
 
// Driver Code
 
    let arr = [ 1, 4, 3, 2 ];
    let N = arr.length;
  
    checksubarrayExist1_N(arr, N);
   
</script>           
Producción: 

True False False True

 

Complejidad de tiempo: O(N * log(N))
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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