Encuentre el número máximo que se repite en O(n) tiempo y O(1) espacio extra

Dada una array de tamaño n , la array contiene números en el rango de 0 a k-1 , donde k es un número entero positivo y k <= n. Encuentre el número máximo que se repite en esta array. Por ejemplo, sea k 10, la array dada sea arr[] = {1, 2, 2, 2, 0, 2, 0, 2, 3, 8, 0, 9, 2, 3}, el número máximo que se repite sería sea ​​2. La complejidad de tiempo esperada es O(n) y el espacio extra permitido es O(1) . Se permiten modificaciones a la array. 

El enfoque ingenuo es ejecutar dos bucles, el bucle exterior elige un elemento uno por uno y el bucle interior cuenta una cantidad de ocurrencias del elemento seleccionado. Finalmente, devuelva el elemento con un recuento máximo. La complejidad temporal de este enfoque es O(n^2) .
Un mejor enfoque es crear una array de conteo de tamaño k e inicializar todos los elementos de conteo[] como 0. Iterar a través de todos los elementos de la array de entrada, y para cada elemento arr[i] , incrementar conteo[arr[i]] . Finalmente, itere a través de count[] y devuelva el índice con el valor máximo. Este enfoque requiere tiempo O(n), pero requiere espacio O(k).

A continuación se presenta el enfoque de O(n) tiempo y O(1) espacio adicional
Entendamos el enfoque con un ejemplo simple donde arr[] = {2, 3, 3, 5, 3, 4, 1, 7}, k = 8, n = 8 (número de elementos en arr[]).

  1. Iterar a través de la array de entrada arr[] , para cada elemento arr[i] , incrementar arr[arr[i]%k] por k ( arr[] se convierte en {2, 11, 11, 29, 11, 12, 1, 15 } )
  2. Encuentre el valor máximo en la array modificada (el valor máximo es 29). El índice del valor máximo es el elemento repetido máximo (el índice de 29 es 3).
  3. Si queremos recuperar la array original, podemos iterar a través de la array una vez más y hacer arr[i] = arr[i] % k donde i varía de 0 a n-1 .

¿Cómo funciona el algoritmo anterior? Dado que usamos arr[i]%k como índice y agregamos el valor k en el índice arr[i]%k , el índice que es igual al elemento repetido máximo tendrá el valor máximo al final. Tenga en cuenta que k se agrega el número máximo de veces en el índice igual al elemento repetido máximo y todos los elementos de la array son más pequeños que k.
A continuación se muestra la implementación en C++ del algoritmo anterior. 

C++

// C++ program to find the maximum repeating number
 
#include<iostream>
using namespace std;
 
// Returns maximum repeating element in arr[0..n-1].
// The array elements are in range from 0 to k-1
int maxRepeating(int* arr, int n, int k)
{
    // Iterate though input array, for every element
    // arr[i], increment arr[arr[i]%k] by k
    for (int i = 0; i< n; i++)
        arr[arr[i]%k] += k;
 
    // Find index of the maximum repeating element
    int max = arr[0], result = 0;
    for (int i = 1; i < n; i++)
    {
        if (arr[i] > max)
        {
            max = arr[i];
            result = i;
        }
    }
 
    /* Uncomment this code to get the original array back
       for (int i = 0; i< n; i++)
          arr[i] = arr[i]%k; */
 
    // Return index of the maximum element
    return result;
}
 
// Driver program to test above function
int main()
{
    int arr[] = {2, 3, 3, 5, 3, 4, 1, 7};
    int n = sizeof(arr)/sizeof(arr[0]);
    int k = 8;
 
    cout << "The maximum repeating number is " <<
         maxRepeating(arr, n, k) << endl;
 
    return 0;
}

Java

// Java program to find the maximum repeating number
import java.io.*;
 
class MaxRepeating {
 
    // Returns maximum repeating element in arr[0..n-1].
    // The array elements are in range from 0 to k-1
    static int maxRepeating(int arr[], int n, int k)
    {
        // Iterate though input array, for every element
        // arr[i], increment arr[arr[i]%k] by k
        for (int i = 0; i< n; i++)
            arr[(arr[i]%k)] += k;
 
        // Find index of the maximum repeating element
        int max = arr[0], result = 0;
        for (int i = 1; i < n; i++)
        {
            if (arr[i] > max)
            {
                max = arr[i];
                result = i;
            }
        }
 
        /* Uncomment this code to get the original array back
        for (int i = 0; i< n; i++)
          arr[i] = arr[i]%k; */
 
        // Return index of the maximum element
        return result;
    }
 
    /*Driver function to check for above function*/
    public static void main (String[] args)
    {
 
        int arr[] = {2, 3, 3, 5, 3, 4, 1, 7};
        int n = arr.length;
        int k=8;
        System.out.println("Maximum repeating element is: " +
                           maxRepeating(arr,n,k));
    }
}
/* This code is contributed by Devesh Agrawal */

Python3

# Python program to find the maximum repeating number
 
# Returns maximum repeating element in arr[0..n-1].
# The array elements are in range from 0 to k-1
def maxRepeating(arr, n,  k):
 
    # Iterate though input array, for every element
    # arr[i], increment arr[arr[i]%k] by k
    for i in range(0,  n):
        arr[arr[i]%k] += k
 
    # Find index of the maximum repeating element
    max = arr[0]
    result = 0
    for i in range(1, n):
     
        if arr[i] > max:
            max = arr[i]
            result = i
 
    # Uncomment this code to get the original array back
    #for i in range(0, n):
    #    arr[i] = arr[i]%k
 
    # Return index of the maximum element
    return result
 
 
# Driver program to test above function
arr = [2, 3, 3, 5, 3, 4, 1, 7]
n = len(arr)
k = 8
print("The maximum repeating number is",maxRepeating(arr, n, k))
 
# This code is contributed by
# Smitha Dinesh Semwal

C#

//C# program to find the maximum repeating
// number
using System;
 
class GFG {
     
    // Returns maximum repeating element
    // in arr[0..n-1].
    // The array elements are in range
    // from 0 to k-1
    static int maxRepeating(int []arr,
                             int n, int k)
    {
        // Iterate though input array, for
        // every element arr[i], increment
        // arr[arr[i]%k] by k
        for (int i = 0; i< n; i++)
            arr[(arr[i]%k)] += k;
 
        // Find index of the maximum
        // repeating element
        int max = arr[0], result = 0;
         
        for (int i = 1; i < n; i++)
        {
            if (arr[i] > max)
            {
                max = arr[i];
                result = i;
            }
        }
 
        // Return index of the
        // maximum element
        return result;
    }
 
    /*Driver function to check for
     above function*/
    public static void Main ()
    {
 
        int []arr = {2, 3, 3, 5, 3, 4, 1, 7};
        int n = arr.Length;
        int k=8;
         
        Console.Write("Maximum repeating "
                          + "element is: "
                  + maxRepeating(arr,n,k));
    }
}
 
// This code is contributed by Sam007.

PHP

<?php
// PHP program to find the
// maximum repeating number
 
// Returns maximum repeating
// element in arr[0..n-1].
// The array elements are
// in range from 0 to k-1
function maxRepeating($arr, $n, $k)
{
     
    // Iterate though input array,
    // for every element arr[i],
    // increment arr[arr[i]%k] by k
    for ($i = 0; $i< $n; $i++)
        $arr[$arr[$i] % $k] += $k;
 
        // Find index of the
        // maximum repeating
        // element
        $max = $arr[0];
        $result = 0;
    for ($i = 1; $i < $n; $i++)
    {
        if ($arr[$i] > $max)
        {
            $max = $arr[$i];
            $result = $i;
        }
    }
 
    /* Uncomment this code to
       get the original array back
       for (int i = 0; i< n; i++)
       arr[i] = arr[i] % k; */
 
    // Return index of the
    // maximum element
    return $result;
}
 
    // Driver Code
    $arr = array(2, 3, 3, 5, 3, 4, 1, 7);
    $n = sizeof($arr);
    $k = 8;
 
    echo "The maximum repeating number is ",
        maxRepeating($arr, $n, $k);
 
// This Code is contributed by Ajit
?>

Javascript

<script>
 
// JavaScript program to find the maximum repeating number
 
// Returns maximum repeating element in arr[0..n-1].
// The array elements are in range from 0 to k-1
function maxRepeating(arr, n, k)
{
    // Iterate though input array, for every element
    // arr[i], increment arr[arr[i]%k] by k
    for (let i = 0; i< n; i++)
        arr[arr[i]%k] += k;
 
    // Find index of the maximum repeating element
    let max = arr[0], result = 0;
    for (let i = 1; i < n; i++)
    {
        if (arr[i] > max)
        {
            max = arr[i];
            result = i;
        }
    }
 
    /* Uncomment this code to get the original array back
    for (int i = 0; i< n; i++)
        arr[i] = arr[i]%k; */
 
    // Return index of the maximum element
    return result;
}
 
// Driver program to test above function
 
    let arr = [2, 3, 3, 5, 3, 4, 1, 7];
    let n = arr.length;
    let k = 8;
 
    document.write("The maximum repeating number is " +
        maxRepeating(arr, n, k) + "<br>");
 
// This code is contributed by Surbhi Tyagi.
 
</script>
Producción

The maximum repeating number is 3

Tiempo Complejidad : O(n) 
Espacio Auxiliar : O(1)

Ejercicio: La solución anterior imprime solo un elemento repetido y no funciona si queremos imprimir todos los elementos repetidos máximos. Por ejemplo, si la array de entrada es {2, 3, 2, 3}, la solución anterior imprimirá solo 3. ¿Qué pasa si necesitamos imprimir tanto 2 como 3, ya que ambos ocurren la mayor cantidad de veces? Escriba una función O(n) de tiempo y O(1) de espacio adicional que imprima todos los elementos repetidos máximos. (Sugerencia: podemos usar el cociente máximo arr[i]/n en lugar del valor máximo en el paso 2).
Tenga en cuenta que las soluciones anteriores pueden causar un desbordamiento si agregar k repetidamente hace que el valor sea mayor que INT_MAX.  

Publicación traducida automáticamente

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