El elemento más pequeño que aparece en cada subsecuencia

Dada una array de N enteros distintos. Para cada elemento, la tarea es encontrar el recuento de subsecuencias de todas las subsecuencias posibles cuyo elemento mínimo es el elemento actual.
Ejemplos: 

Entrada: arr[] = {1, 2} 
Salida: 2 1 
Explicación: 
Las subsecuencias son {1}, {2}, {1, 2}. 
El conteo del elemento más pequeño en cada subsecuencia es: 
1 = 2, 2 = 1
Entrada: arr[] = {1, 2, 3} 
Salida: 4 2 1

Enfoque ingenuo: la idea es generar todas las subsecuencias posibles de la array dada y contar el elemento más pequeño en cada subsecuencia e imprimir su cuenta para cada elemento de la array. 
Complejidad temporal: O(2 N
Espacio auxiliar: O(N)
 

Enfoque eficiente: la idea es observar un patrón, es decir, observar que el elemento mínimo ocurre 2 n – 1 veces, el segundo mínimo ocurre 2 n – 2 veces y así sucesivamente… . Por ejemplo:

Sea el arreglo arr[] = {1, 2, 3} 
Las subsecuencias son {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3} 
Mínimo de cada subsecuencia: {1}, {2}, {3}, {1}, {1}, {2}, {1}. 
donde 
1 ocurre 4 veces, es decir, 2 n – 1 donde n = 3. 
2 ocurre 2 veces, es decir, 2 n – 2 donde n = 3. 
3 ocurre 1 vez, es decir, 2 n – 3 donde n = 3.

A continuación se muestran los pasos:  

  1. Almacene el índice de cada elemento en un mapa de modo que podamos imprimir el elemento en el orden de la array original.
  2. Ordenar la array dada.
  3. Ahora los elementos están en orden creciente y, a partir de la observación anterior, atraviesan la array dada y mantienen el recuento de la subsecuencia de modo que cada elemento sea el elemento más pequeño dado por pow(2, N – 1 – i) .
  4. Ahora recorra el mapa e imprima el recuento de subsecuencias de acuerdo con el elemento en la array original.

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 that count the subsequence
// such that each element as the
// minimum element in the subsequence
void solve(int arr[], int N)
{
    map<int, int> M;
 
    // Store index in a map
    for (int i = 0; i < N; i++) {
        M[i] = arr[i];
    }
 
    // Sort the array
    sort(arr, arr + N);
 
    // To store count of subsequence
    unordered_map<int, int> Count;
 
    // Traverse the array
    for (int i = 0; i < N; i++) {
 
        // Store count of subsequence
        Count[arr[i]] = pow(2, N - i - 1);
    }
 
    // Print the count of subsequence
    for (auto& it : M) {
        cout << Count[M[it.second]] << ' ';
    }
}
 
// Driver code
int main()
{
    int arr[] = { 5, 2, 1 };
    int N = sizeof arr / sizeof arr[0];
 
    // Function call
    solve(arr, N);
}

Java

// Java program for the above approach
import java.util.*;
class GFG{
 
// Function that count the subsequence
// such that each element as the
// minimum element in the subsequence
static void solve(int arr[], int N)
{
    HashMap<Integer,
              Integer> M = new HashMap<>();
 
    // Store index in a map
    for (int i = 0; i < N; i++)
    {
        M.put(i, arr[i]);
    }
 
    // Sort the array
    Arrays.sort(arr);
 
    // To store count of subsequence
    HashMap<Integer,
              Integer> Count = new HashMap<>();
 
    // Traverse the array
    for (int i = 0; i < N; i++)
    {
 
        // Store count of subsequence
        Count.put(arr[i],
                 (int)Math.pow(2, N - i - 1));
    }
 
    // Print the count of subsequence
    for (Map.Entry<Integer,
                    Integer> m : M.entrySet())
    {
        System.out.print(Count.get(m.getValue()) + " ");
    }
}
 
// Driver code
public static void main(String[] args)
{
    int arr[] = { 5, 2, 1 };
    int N = arr.length;
 
    // Function call
    solve(arr, N);
}
}
 
// This code is contributed by Amit Katiyar

Python3

# Python3 program for the above approach
 
# Function that count the subsequence
# such that each element as the
# minimum element in the subsequence
def solve(arr, N):
 
    M = {}
 
    # Store index in a map
    for i in range(N):
        M[i] = arr[i]
     
    # Sort the array
    arr.sort()
 
    # To store count of subsequence
    Count = {}
 
    # Traverse the array
    for i in range(N):
 
        # Store count of subsequence
        Count[arr[i]] = pow(2, N - i - 1)
 
    # Print the count of subsequence
    for it in Count.values():
        print(it, end = " ")
 
# Driver code
if __name__ == "__main__":
 
    arr = [ 5, 2, 1 ]
    N = len(arr)
 
    # Function call
    solve(arr, N)
 
# This code is contributed by chitranayal

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
// Function that count the subsequence
// such that each element as the
// minimum element in the subsequence
static void solve(int []arr, int N)
{
    Dictionary<int,
               int> M = new Dictionary<int,
                                         int>();
 
    // Store index in a map
    for (int i = 0; i < N; i++)
    {
        M.Add(i, arr[i]);
    }
 
    // Sort the array
    Array.Sort(arr);
 
    // To store count of subsequence
    Dictionary<int,
               int> Count = new Dictionary<int,
                                             int>();
 
    // Traverse the array
    for (int i = 0; i < N; i++)
    {
 
        // Store count of subsequence
        Count.Add(arr[i],
                 (int)Math.Pow(2, N - i - 1));
    }
  // Print the count of subsequence
   foreach(KeyValuePair<int, int> m in M)
{
    Console.Write(Count[m.Value]);  
} 
}
 
// Driver code
public static void Main(String[] args)
{
    int []arr = { 5, 2, 1 };
    int N = arr.Length;
 
    // Function call
    solve(arr, N);
}
}
 
// This code is contributed by PrinciRaj1992

Javascript

<script>
 
// Javascript program for the above approach
 
// Function that count the subsequence
// such that each element as the
// minimum element in the subsequence
function solve(arr, N)
{
    var M = new Map();
 
    // Store index in a map
    for (var i = 0; i < N; i++) {
        M.set(i, arr[i]);
    }
 
    // Sort the array
    arr.sort((a,b)=>a-b);
 
    // To store count of subsequence
    var Count = new Map();
 
    // Traverse the array
    for (var i = 0; i < N; i++) {
 
        // Store count of subsequence
        Count.set(arr[i], parseInt(Math.pow(2, N - i - 1)));
    }
 
    // Print the count of subsequence
    M.forEach((value, key) => {
        document.write(Count.get(value) + ' ');
    });
     
}
 
// Driver code
var arr = [5, 2, 1];
var N = arr.length;
// Function call
solve(arr, N);
 
// This code is contributed by rrrtnx.
</script>
Producción: 

4 2 1

 

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

Publicación traducida automáticamente

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