Número de mezclas necesarias para que cada elemento vuelva a su posición inicial

Dada una array de enteros arr[] que contiene una permutación de enteros de 1 a N . Sea K[] una array arbitraria. Cada elemento de la array arr[i] representa el índice del elemento en el que se coloca el elemento que se encuentra inicialmente en la posición ‘i’ de la array K[]. La tarea es encontrar el número de mezclas necesarias que se deben realizar en K[] para que los elementos vuelvan a la posición inicial. 
Nota: se da que al menos se debe hacer 1 barajado sobre K[] (es decir), el elemento que está inicialmente en la posición ‘i’ en la array K[] debe colocarse en el índice arr[i] al menos una vez para todos los elementos del arreglo K[]. 
Ejemplos: 
 

Entrada: arr[] = {3, 4, 1, 2} 
Salida: 2 2 2 2 
Explicación: 
Sea el arreglo inicial B[] = {5, 6, 7, 8}. Por lo tanto: 
Después de la primera reproducción aleatoria: el primer elemento irá a la tercera posición, el segundo elemento irá a la cuarta posición. Por lo tanto, B[] = {7, 8, 5, 6}. 
Después de la segunda reproducción aleatoria: el primer elemento irá a la tercera posición, el segundo elemento irá a la cuarta posición. Por lo tanto, B[] = {5, 6, 7, 8}. 
Por tanto, el número de barajes es 2 para que todos los elementos vuelvan a la misma posición inicial.
Entrada: arr[] = {4, 6, 2, 1, 5, 3} 
Salida: 2 3 3 2 1 3 
 

Enfoque ingenuo: El enfoque ingenuo para este problema es contar el número de barajas necesarias para cada elemento. La complejidad temporal para este enfoque sería O(N 2 ) .
Enfoque eficiente: un enfoque eficiente para este problema es calcular primero el número de ciclos en el problema. Los elementos en el mismo ciclo tienen el mismo número de mezclas. Por ejemplo, en la array dada arr[] = {3, 4, 1, 2}:
 

  • En cada barajada, el primer elemento siempre va al tercer lugar y el tercer elemento siempre llega al primer lugar.
  • Por lo tanto, se puede concluir que ambos elementos están en un ciclo. Por lo tanto, el número de mezclas tomadas para ambos elementos es 2, independientemente de cuál sea la array K[] .
  • Por lo tanto, la idea es encontrar el número de dichos ciclos en la array y omitir esos elementos.

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

C++

// C++ program to find the number of
// shuffles required for each element
// to return to its initial position
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to count the number of
// shuffles required for each element
// to return to its initial position
void countShuffles(int* A, int N)
{
    // Initialize array to store
    // the counts
    int count[N];
 
    // Initialize visited array to
    // check if visited before or not
    bool vis[N];
    memset(vis, false, sizeof(vis));
 
    // Making the array 0-indexed
    for (int i = 0; i < N; i++)
        A[i]--;
 
    for (int i = 0; i < N; i++) {
        if (!vis[i]) {
 
            // Initialize vector to store the
            // elements in the same cycle
            vector<int> cur;
 
            // Initialize variable to store
            // the current element
            int pos = i;
 
            // Count number of shuffles
            // for current element
            while (!vis[pos]) {
 
                // Store the elements in
                // the same cycle
                cur.push_back(pos);
 
                // Mark visited
                vis[pos] = true;
 
                // Make the shuffle
                pos = A[pos];
            }
 
            // Store the result for all the
            // elements in the same cycle
            for (auto el : cur)
                count[el] = cur.size();
        }
    }
 
    // Print the result
    for (int i = 0; i < N; i++)
        cout << count[i] << " ";
    cout << endl;
}
 
// Driver code
int main()
{
    int arr[] = { 4, 6, 2, 1, 5, 3 };
 
    int N = sizeof(arr) / sizeof(arr[0]);
 
    countShuffles(arr, N);
 
    return 0;
}

Java

// Java program to find the number of
// shuffles required for each element
// to return to its initial position
import java.util.*;
 
class GFG {
 
// Function to count the number of
// shuffles required for each element
// to return to its initial position
static void countShuffles(int[] A, int N)
{
     
    // Initialize array to store
    // the counts
    int[] count = new int[N];
 
    // Initialize visited array to
    // check if visited before or not
    boolean[] vis = new boolean[N];
 
    // Making the array 0-indexed
    for(int i = 0; i < N; i++)
       A[i]--;
 
    for(int i = 0; i < N; i++)
    {
       if (!vis[i])
       {
            
           // Initialize vector to store the
           // elements in the same cycle
           Vector<Integer> cur = new Vector<>(); 
            
           // Initialize variable to store
           // the current element
           int pos = i;
            
           // Count number of shuffles
           // for current element
           while (!vis[pos])
           {
                
               // Store the elements in
               // the same cycle
               cur.add(pos);
                
               // Mark visited
               vis[pos] = true;
                
               // Make the shuffle
               pos = A[pos];
            }
             
            // Store the result for all the
            // elements in the same cycle
            for(int k = 0; k < cur.size(); k++)
               count[cur.get(k)] = cur.size();
       }
    }
     
    // Print the result
    for(int k = 0; k < N; k++)
       System.out.print(count[k] + " ");
}
 
// Driver code
public static void main(String[] args)
{
    int arr[] = { 4, 6, 2, 1, 5, 3 };
    int N = arr.length;
 
    countShuffles(arr, N);
}
}
 
// This code is contributed by offbeat

Python3

# Python3 program to find the number of
# shuffles required for each element
# to return to its initial position
 
# Function to count the number of
# shuffles required for each element
# to return to its initial position
def countShuffles(A, N):
 
    # Initialize array to store
    # the counts
    count = [0] * N
 
    # Initialize visited array to
    # check if visited before or not
    vis = [False] * N
 
    # Making the array 0-indexed
    for i in range(N):
        A[i] -= 1
 
    for i in range(N):
        if (not vis[i]):
 
            # Initialize vector to store the
            # elements in the same cycle
            cur = []
 
            # Initialize variable to store
            # the current element
            pos = i
 
            # Count number of shuffles
            # for current element
            while (not vis[pos]):
 
                # Store the elements in
                # the same cycle
                cur.append(pos)
 
                # Mark visited
                vis[pos] = True
 
                # Make the shuffle
                pos = A[pos]
 
            # Store the result for all the
            # elements in the same cycle
            for el in cur:
                count[el] = len(cur)
 
    # Print the result
    for i in range(N):
        print(count[i], end = " ")
    print()
 
# Driver code
if __name__ == "__main__":
     
    arr = [ 4, 6, 2, 1, 5, 3 ]
    N = len(arr)
    countShuffles(arr, N)
     
# This code is contributed by chitranayal

C#

// C# program to find the number of
// shuffles required for each element
// to return to its initial position
using System;
using System.Collections;
 
class GFG{
 
// Function to count the number of
// shuffles required for each element
// to return to its initial position
static void countShuffles(int[] A, int N)
{
     
    // Initialize array to store
    // the counts
    int[] count = new int[N];
 
    // Initialize visited array to
    // check if visited before or not
    bool[] vis = new bool[N];
 
    // Making the array 0-indexed
    for(int i = 0; i < N; i++)
        A[i]--;
 
    for(int i = 0; i < N; i++)
    {
        if (!vis[i])
        {
             
            // Initialize vector to store the
            // elements in the same cycle
            ArrayList cur = new ArrayList();
         
            // Initialize variable to store
            // the current element
            int pos = i;
                 
            // Count number of shuffles
            // for current element
            while (!vis[pos])
            {
                 
                // Store the elements in
                // the same cycle
                cur.Add(pos);
                     
                // Mark visited
                vis[pos] = true;
                     
                // Make the shuffle
                pos = A[pos];
            }
             
            // Store the result for all the
            // elements in the same cycle
            for(int k = 0; k < cur.Count; k++)
                count[(int)cur[k]] = cur.Count;
        }
    }
     
    // Print the result
    for(int k = 0; k < N; k++)
        Console.Write(count[k] + " ");
}
 
// Driver code
public static void Main(string[] args)
{
    int []arr = { 4, 6, 2, 1, 5, 3 };
    int N = arr.Length;
 
    countShuffles(arr, N);
}
}
 
// This code is contributed by rutvik_56

Javascript

<script>
 
// Javascript program to find the number of
// shuffles required for each element
// to return to its initial position
 
// Function to count the number of
// shuffles required for each element
// to return to its initial position
function countShuffles(A, N)
{
 
    // Initialize array to store
    // the counts
    var count = Array(N);
 
    // Initialize visited array to
    // check if visited before or not
    var vis = Array(N).fill(false);
 
    // Making the array 0-indexed
    for (var i = 0; i < N; i++)
        A[i]--;
 
    for (var i = 0; i < N; i++) {
        if (!vis[i]) {
 
            // Initialize vector to store the
            // elements in the same cycle
            var cur = [];
 
            // Initialize variable to store
            // the current element
            var pos = i;
 
            // Count number of shuffles
            // for current element
            while (!vis[pos]) {
 
                // Store the elements in
                // the same cycle
                cur.push(pos);
 
                // Mark visited
                vis[pos] = true;
 
                // Make the shuffle
                pos = A[pos];
            }
 
            // Store the result for all the
            // elements in the same cycle
            for( var e1 = 0; e1<cur.length; e1++)
            {
                count[cur[e1]]=cur.length;
            }
         
        }
    }
 
    // Print the result
    for (var i = 0; i < N; i++)
        document.write( count[i] + " ");
    document.write("<br>");
}
 
// Driver code
var arr = [ 4, 6, 2, 1, 5, 3 ];
var N = arr.length;
countShuffles(arr, N);
 
// This code is contributed by rrrtnx.
</script>
Producción: 

2 3 3 2 1 3

 

Complejidad de tiempo: O(N) , donde N es el tamaño de la array.
 

Publicación traducida automáticamente

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