Encuentre el rango relativo de cada elemento en la array

Dado un arreglo A[] de N enteros, la tarea es encontrar el rango relativo para cada elemento en el arreglo dado.

El rango relativo para cada elemento de la array es el recuento de elementos que es mayor que el elemento actual en la subsecuencia creciente más larga del elemento actual.

Ejemplos:

Entrada: A[] = {8, 16, 5, 6, 9}, N = 5
Salida: {1, 0, 2, 1, 0}
Explicación:
Para i = 0, la secuencia requerida es {8, 16} Relativa Rango = 1.
Para i = 1, dado que todos los elementos después de 16 son menores que 16, Rango relativo = 0.
Para i = 2, la secuencia requerida es {5, 6, 9} Rango relativo = 2
Para i = 3, la secuencia requerida es {6, 9} Rango relativo = 1
Para i = 4, la secuencia requerida es {9} Rango relativo = 0

Entrada: A[] = {1, 2, 3, 5, 4}
Salida: {3, 2, 1, 0, 0}
Explicación:
Para i = 0, la secuencia requerida es {1, 2, 3, 5}, Rango relativo = 3
Para i = 1, la secuencia requerida es {2, 3, 5}, Rango relativo = 2
Para i = 2, la secuencia requerida es {3, 5}, Rango relativo = 1
Para i = 3, la secuencia requerida es {5}, rango relativo = 0
Para i = 4, la secuencia requerida es {4}, rango relativo = 0

Enfoque ingenuo: la idea es generar la subsecuencia creciente más larga para cada elemento y luego, el rango relativo para cada elemento es (longitud de LIS – 1) .

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

Enfoque eficiente: para optimizar el enfoque anterior, la idea es usar una pila y almacenar los elementos en orden no decreciente desde la derecha hasta cada elemento (digamos A[i] ), luego el rango para cada A[i] es el (tamaño de la pila – 1) hasta ese elemento. A continuación se muestra la ilustración del mismo:

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;
  
// Function to find relative rank for
// each element in the array A[]
void findRank(int A[], int N)
{
    // Create Rank Array
    int rank[N] = {};
  
    // Stack to store numbers in
    // non-decreasing order from right
    stack<int> s;
  
    // Push last element in stack
    s.push(A[N - 1]);
  
    // Iterate from second last
    // element to first element
    for (int i = N - 2; i >= 0; i--) {
  
        // If current element is less
        // than the top of stack and
        // push A[i] in stack
        if (A[i] < s.top()) {
  
            s.push(A[i]);
  
            // Rank is stack size - 1
            // for current element
            rank[i] = s.size() - 1;
        }
        else {
  
            // Pop elements from stack
            // till current element is
            // greater than the top
            while (!s.empty()
                   && A[i] >= s.top()) {
                s.pop();
            }
  
            // Push current element in Stack
            s.push(A[i]);
  
            // Rank is stack size - 1
            rank[i] = s.size() - 1;
        }
    }
  
    // Print rank of all elements
    for (int i = 0; i < N; i++) {
        cout << rank[i] << " ";
    }
}
  
// Driver Code
int main()
{
    // Given array A[]
    int A[] = { 1, 2, 3, 5, 4 };
  
    int N = sizeof(A) / sizeof(A[0]);
  
    // Function call
    findRank(A, N);
    return 0;
}

Java

// Java program to implement
// the above approach
import java.io.*;
import java.util.*;
import java.lang.*;
  
class GFG{
      
// Function to find relative rank for
// each element in the array A[]
static void findRank(int[] A, int N)
{
      
    // Create Rank Array
    int[] rank = new int[N];
  
    // Stack to store numbers in
    // non-decreasing order from right
    Stack<Integer> s = new Stack<Integer>();
  
    // Push last element in stack
    s.add(A[N - 1]);
  
    // Iterate from second last
    // element to first element
    for(int i = N - 2; i >= 0; i--)
    {
          
        // If current element is less
        // than the top of stack and
        // push A[i] in stack
        if (A[i] < s.peek()) 
        {
            s.add(A[i]);
  
            // Rank is stack size - 1
            // for current element
            rank[i] = s.size() - 1;
        }
        else
        {
  
            // Pop elements from stack
            // till current element is
            // greater than the top
            while (!s.isEmpty() && 
                    A[i] >= s.peek())
            {
                s.pop();
            }
  
            // Push current element in Stack
            s.add(A[i]);
  
            // Rank is stack size - 1
            rank[i] = s.size() - 1;
        }
    }
  
    // Print rank of all elements
    for(int i = 0; i < N; i++) 
    {
        System.out.print(rank[i] + " ");
    }
}
  
// Driver Code
public static void main(String[] args)
{
      
    // Given array A[]
    int A[] = { 1, 2, 3, 5, 4 };
  
    int N = A.length;
  
    // Function call
    findRank(A, N);
}
}
  
// This code is contributed by sanjoy_62

Python3

# Python3 program for the above approach
  
# Function to find relative rank for
# each element in the array A[]
def findRank(A, N):
      
    # Create Rank Array
    rank = [0] * N
  
    # Stack to store numbers in
    # non-decreasing order from right
    s = []
  
    # Push last element in stack
    s.append(A[N - 1])
  
    # Iterate from second last
    # element to first element
    for i in range(N - 2, -1, -1):
  
        # If current element is less
        # than the top of stack and
        # append A[i] in stack
        if (A[i] < s[-1]):
            s.append(A[i])
  
            # Rank is stack size - 1
            # for current element
            rank[i] = len(s) - 1
  
        else:
  
            # Pop elements from stack
            # till current element is
            # greater than the top
            while (len(s) > 0 and A[i] >= s[-1]):
                del s[-1]
  
            # Push current element in Stack
            s.append(A[i])
  
            # Rank is stack size - 1
            rank[i] = len(s) - 1
  
    # Print rank of all elements
    for i in range(N):
        print(rank[i], end = " ")
          
# Driver Code
if __name__ == '__main__':
  
    # Given array A[]
    A = [ 1, 2, 3, 5, 4 ]
  
    N = len(A)
  
    # Function call
    findRank(A, 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 find relative rank for
// each element in the array A[]
static void findRank(int[] A, int N)
{
      
    // Create Rank Array
    int[] rank = new int[N];
  
    // Stack to store numbers in
    // non-decreasing order from right
    Stack<int> s = new Stack<int>();
  
    // Push last element in stack
    s.Push(A[N - 1]);
  
    // Iterate from second last
    // element to first element
    for(int i = N - 2; i >= 0; i--)
    {
  
        // If current element is less
        // than the top of stack and
        // push A[i] in stack
        if (A[i] < s.Peek())
        {
            s.Push(A[i]);
  
            // Rank is stack size - 1
            // for current element
            rank[i] = s.Count() - 1;
        }
        else
        {
  
            // Pop elements from stack
            // till current element is
            // greater than the top
            while (s.Count() != 0 && 
                   A[i] >= s.Peek())
            {
                s.Pop();
            }
  
            // Push current element in Stack
            s.Push(A[i]);
  
            // Rank is stack size - 1
            rank[i] = s.Count() - 1;
        }
    }
  
    // Print rank of all elements
    for(int i = 0; i < N; i++)
    {
        Console.Write(rank[i] + " ");
    }
}
  
// Driver Code
public static void Main()
{
      
    // Given array A[]
    int[] A = new int[] { 1, 2, 3, 5, 4 };
  
    int N = A.Length;
  
    // Function call
    findRank(A, N);
}
}
  
// This code is contributed by sanjoy_62
Producción:

3 2 1 0 0


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

Publicación traducida automáticamente

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