Duplica en un arreglo en tiempo O(n) y usando espacio extra O(1) | Conjunto-3

Dada una array de n elementos que contiene elementos de 0 a n-1, cualquiera de estos números aparece cualquier número de veces. Encuentre estos números repetidos en O (n) y use solo espacio de memoria constante. Se requiere que se mantenga el orden en que se repiten los elementos. Si no hay ningún elemento repetitivo presente, imprima -1.
Ejemplos: 
 

Input : arr[] = {1, 2, 3, 1, 3, 6, 6}
Output : 1, 3, 6
Elements 1, 3 and 6 are repeating.
Second occurrence of 1 is found
first followed by repeated occurrence
of 3 and 6.

Input : arr[] = {0, 3, 1, 3, 0}
Output : 3, 0
Second occurrence of 3 is found
first followed by second occurrence 
of 0.

Hemos discutido dos enfoques para esta pregunta en las publicaciones a continuación: 
Buscar duplicados en tiempo O (n) y espacio extra O (1) | Establezca 1  
duplicados en una array en tiempo O (n) y usando O (1) espacio adicional | Conjunto-2
Hay un problema en el primer acercamiento. Imprime el número repetido más de una vez. Por ejemplo: {1, 6, 3, 1, 3, 6, 6} dará como resultado: 3 6 6. En el segundo enfoque, aunque cada elemento repetido se imprime solo una vez, el orden en que ocurre su repetición no se mantiene . Para imprimir elementos en el orden en que se repiten, se modifica el segundo enfoque. Para marcar la presencia de un tamaño de elemento de la array, se agrega n a la posición de índice arr[i] correspondiente al elemento de la array arr[i]. Antes de agregar n, verifique si el valor en el índice arr[i] es mayor o igual que n o no. Si es mayor o igual que, significa que el elemento arr[i] se repite. Para evitar imprimir elementos repetidos varias veces, compruebe si es la primera repetición de arr[i] o no. Es la primera repetición si el valor en la posición de índice arr[i] es menor que 2*n. Esto se debe a que, si el elemento arr[i] se ha producido solo una vez antes, n se agrega al índice arr[i] solo una vez y, por lo tanto, el valor en el índice arr[i] es menor que 2*n. Agregue n al índice arr[i] para que el valor sea mayor o igual a 2*n y evitará más impresiones del elemento repetitivo actual. Además, si el valor en el índice arr[i] es menor que n, entonces es la primera aparición (no repetición) del elemento arr[i]. Entonces, para marcar esto, agregue n al elemento en el índice arr [i].
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ program to print all elements that
// appear more than once.
#include <bits/stdc++.h>
using namespace std;
 
// Function to find repeating elements
void printDuplicates(int arr[], int n)
{
    int i;
 
    // Flag variable used to
    // represent whether repeating
    // element is found or not.
    int fl = 0;
 
    for (i = 0; i < n; i++) {
 
        // Check if current element is
        // repeating or not. If it is
        // repeating then value will
        // be greater than or equal to n.
        if (arr[arr[i] % n] >= n) {
 
            // Check if it is first
            // repetition or not. If it is
            // first repetition then value
            // at index arr[i] is less than
            // 2*n. Print arr[i] if it is
            // first repetition.
            if (arr[arr[i] % n] < 2 * n) {
                cout << arr[i] % n << " ";
                fl = 1;
            }
        }
 
        // Add n to index arr[i] to mark
        // presence of arr[i] or to
        // mark repetition of arr[i].
        arr[arr[i] % n] += n;
    }
 
    // If flag variable is not set
    // then no repeating element is
    // found. So print -1.
    if (!fl)
        cout << "-1";
}
 
// Driver Function
int main()
{
    int arr[] = { 1, 6, 3, 1, 3, 6, 6 };
    int arr_size = sizeof(arr) / sizeof(arr[0]);
    printDuplicates(arr, arr_size);
    return 0;
}

Java

// Java program to print all elements
// that appear more than once.
import java.io.*;
 
class GFG
{
     
// Function to find repeating elements
static void printDuplicates(int arr[], int n)
{
    int i;
 
    // Flag variable used to
    // represent whether repeating
    // element is found or not.
    int fl = 0;
 
    for (i = 0; i < n; i++)
    {
 
        // Check if current element is
        // repeating or not. If it is
        // repeating then value will
        // be greater than or equal to n.
        if (arr[arr[i] % n] >= n)
        {
 
            // Check if it is first
            // repetition or not. If it is
            // first repetition then value
            // at index arr[i] is less than
            // 2*n. Print arr[i] if it is
            // first repetition.
            if (arr[arr[i] % n] < 2 * n)
            {
                System.out.print( arr[i] % n + " ");
                fl = 1;
            }
        }
 
        // Add n to index arr[i] to mark
        // presence of arr[i] or to
        // mark repetition of arr[i].
        arr[arr[i] % n] += n;
    }
 
    // If flag variable is not set
    // then no repeating element is
    // found. So print -1.
    if (!(fl > 0))
        System.out.println("-1");
}
 
// Driver Code
public static void main (String[] args)
{
    int arr[] = { 1, 6, 3, 1, 3, 6, 6 };
    int arr_size = arr.length;
    printDuplicates(arr, arr_size);
}
}
 
// This code is contributed by anuj_67.

Python 3

# Python 3 program to print all elements that
# appear more than once.
 
# Function to find repeating elements
def printDuplicates(arr, n):
 
    # Flag variable used to
    # represent whether repeating
    # element is found or not.
    fl = 0;
 
    for i in range (0, n):
 
        # Check if current element is
        # repeating or not. If it is
        # repeating then value will
        # be greater than or equal to n.
        if (arr[arr[i] % n] >= n):
 
            # Check if it is first
            # repetition or not. If it is
            # first repetition then value
            # at index arr[i] is less than
            # 2*n. Print arr[i] if it is
            # first repetition.
            if (arr[arr[i] % n] < 2 * n):
                print(arr[i] % n, end = " ")
                fl = 1;
 
        # Add n to index arr[i] to mark
        # presence of arr[i] or to
        # mark repetition of arr[i].
        arr[arr[i] % n] += n;
 
    # If flag variable is not set
    # then no repeating element is
    # found. So print -1.
    if (fl == 0):
        print("-1")
 
# Driver Function
arr = [ 1, 6, 3, 1, 3, 6, 6 ];
arr_size = len(arr);
printDuplicates(arr, arr_size);
 
# This code is contributed
# by Akanksha Rai

C#

// C# program to print all elements
// that appear more than once.
using System;
 
class GFG
{
 
// Function to find repeating elements
static void printDuplicates(int []arr, int n)
{
    int i;
 
    // Flag variable used to
    // represent whether repeating
    // element is found or not.
    int fl = 0;
 
    for (i = 0; i < n; i++)
    {
 
        // Check if current element is
        // repeating or not. If it is
        // repeating then value will
        // be greater than or equal to n.
        if (arr[arr[i] % n] >= n)
        {
 
            // Check if it is first
            // repetition or not. If it is
            // first repetition then value
            // at index arr[i] is less than
            // 2*n. Print arr[i] if it is
            // first repetition.
            if (arr[arr[i] % n] < 2 * n)
            {
                Console.Write( arr[i] % n + " ");
                fl = 1;
            }
        }
 
        // Add n to index arr[i] to mark
        // presence of arr[i] or to
        // mark repetition of arr[i].
        arr[arr[i] % n] += n;
    }
 
    // If flag variable is not set
    // then no repeating element is
    // found. So print -1.
    if (!(fl > 0))
        Console.Write("-1");
}
 
// Driver Code
public static void Main ()
{
    int []arr = { 1, 6, 3, 1, 3, 6, 6 };
    int arr_size = arr.Length;
    printDuplicates(arr, arr_size);
}
}
 
// This code is contributed
// by 29AjayKumar

PHP

<?php
// PHP program to print all elements that
// appear more than once.
 
// Function to find repeating elements
function printDuplicates($arr, $n)
{
    $i;
 
    // Flag variable used to
    // represent whether repeating
    // element is found or not.
    $fl = 0;
 
    for ($i = 0; $i < $n; $i++)
    {
 
        // Check if current element is
        // repeating or not. If it is
        // repeating then value will
        // be greater than or equal to n.
        if ($arr[$arr[$i] % $n] >= $n)
        {
 
            // Check if it is first
            // repetition or not. If it is
            // first repetition then value
            // at index arr[i] is less than
            // 2*n. Print arr[i] if it is
            // first repetition.
            if ($arr[$arr[$i] % $n] < 2 * $n)
            {
                echo $arr[$i] % $n . " ";
                $fl = 1;
            }
        }
 
        // Add n to index arr[i] to mark
        // presence of arr[i] or to
        // mark repetition of arr[i].
        $arr[$arr[$i] % $n] += $n;
    }
 
    // If flag variable is not set
    // then no repeating element is
    // found. So print -1.
    if (!$fl)
        echo "-1";
}
 
// Driver Function
$arr = array(1, 6, 3, 1, 3, 6, 6);
$arr_size = sizeof($arr);
printDuplicates($arr, $arr_size);
 
// This code is contributed
// by Mukul Singh

Javascript

<script>
 
// JavaScript program to print all elements that
// appear more than once.
 
// Function to find repeating elements
function printDuplicates(arr, n)
{
    let i;
 
    // Flag variable used to
    // represent whether repeating
    // element is found or not.
    let fl = 0;
 
    for (i = 0; i < n; i++) {
 
        // Check if current element is
        // repeating or not. If it is
        // repeating then value will
        // be greater than or equal to n.
        if (arr[arr[i] % n] >= n) {
 
            // Check if it is first
            // repetition or not. If it is
            // first repetition then value
            // at index arr[i] is less than
            // 2*n. Print arr[i] if it is
            // first repetition.
            if (arr[arr[i] % n] < 2 * n) {
                document.write(arr[i] % n + " ");
                fl = 1;
            }
        }
 
        // Add n to index arr[i] to mark
        // presence of arr[i] or to
        // mark repetition of arr[i].
        arr[arr[i] % n] += n;
    }
 
    // If flag variable is not set
    // then no repeating element is
    // found. So print -1.
    if (!fl)
        document.write("-1");
}
 
// Driver Function
  
    let arr = [ 1, 6, 3, 1, 3, 6, 6 ];
    let arr_size = arr.length;
    printDuplicates(arr, arr_size);
 
// This code is contributed by Surbhi Tyagi.
 
</script>
Producción: 

1 3 6

 

Complejidad de tiempo: O (N), ya que estamos usando un bucle para atravesar N veces.

Espacio auxiliar: O(1), ya que no estamos utilizando ningún espacio adicional.

Publicación traducida automáticamente

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