Número más pequeño que divide el número mínimo de elementos en la array | conjunto 2

Dada una array arr[] de N enteros, la tarea es encontrar el número más pequeño que divide la cantidad mínima de elementos de la array.
Ejemplos: 
 

Entrada: arr[] = {2, 12, 6} 
Salida:
Aquí, 1 divide 3 elementos 
2 divide 3 elementos 
3 divide 2 elementos 
4 divide 1 elemento 
5 divide ningún elemento 
6 divide 2 elementos 
7 divide ningún elemento 
8 divide ningún elemento 
9 no divide ningún elemento 
10 no divide ningún elemento 
11 no divide ningún elemento 
12 divide 1 elemento 
5 es el número más pequeño que no divide ningún 
número en la array. Por lo tanto, ans = 5
Entrada: arr[] = {1, 7, 9} 
Salida:
 

Planteamiento: Observemos primero algunos detalles. Ya existe un número que divide cero elementos, es decir, max(arr) + 1 . Ahora, solo necesitamos encontrar el número mínimo que divide cero números en la array.
En este artículo, se discutirá un enfoque para resolver este problema en O(M*log(M) + N) usando un tamiz (M = max(arr)). 
 

  • Primero, encuentre el elemento máximo, M , en la array y cree una tabla de frecuencia freq[] de longitud M + 1 para almacenar la frecuencia de los números entre 1 y M .
  • Itere la array y actualice freq[] como freq[arr[i]]++ para cada índice i .
  • Ahora, aplica el algoritmo tamiz. Iterar entre todos los elementos entre 1 y M + 1
    • Digamos que estamos iterando por un número X.
    • Cree una variable temporal cnt .
    • Para cada múltiplo de X entre X y M {X, 2X, 3X….} actualice cnt como cnt = cnt + freq[kX] .
    • Si cnt = 0 , la respuesta será X ; de lo contrario, continúe iterando para el siguiente valor de X.

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

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the smallest number
// that divides minimum number of elements
// in the given array
int findMin(int* arr, int n)
{
    // m stores the maximum in the array
    int m = 0;
    for (int i = 0; i < n; i++)
        m = max(m, arr[i]);
 
    // Frequency array
    int freq[m + 2] = { 0 };
    for (int i = 0; i < n; i++)
        freq[arr[i]]++;
 
    // Sieve
    for (int i = 1; i <= m + 1; i++) {
        int j = i;
        int cnt = 0;
         
        // Incrementing j
        while (j <= m) {
            cnt += freq[j];
            j += i;
        }
 
        // If no multiples of j are
        // in the array
        if (!cnt)
            return i;
    }
 
    return m + 1;
}
 
// Driver code
int main()
{
    int arr[] = { 2, 12, 6 };
    int n = sizeof(arr) / sizeof(int);
 
    cout << findMin(arr, n);
     
    return 0;
}

Java

// Java implementation of the approach
class GFG
{
     
    // Function to return the smallest number
    // that divides minimum number of elements
    // in the given array
    static int findMin(int arr[], int n)
    {
        // m stores the maximum in the array
        int m = 0;
        for (int i = 0; i < n; i++)
            m = Math.max(m, arr[i]);
     
        // Frequency array
        int freq [] = new int[m + 2];
        for (int i = 0; i < n; i++)
            freq[arr[i]]++;
     
        // Sieve
        for (int i = 1; i <= m + 1; i++)
        {
            int j = i;
            int cnt = 0;
             
            // Incrementing j
            while (j <= m)
            {
                cnt += freq[j];
                j += i;
            }
     
            // If no multiples of j are
            // in the array
            if (cnt == 0)
                return i;
        }
        return m + 1;
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int arr[] = { 2, 12, 6 };
        int n = arr.length;
     
        System.out.println(findMin(arr, n));
    }
}
 
// This code is contributed by AnkitRai01

Python3

# Python3 implementation of the approach
 
# Function to return the smallest number
# that divides minimum number of elements
# in the given array
def findMin(arr, n):
     
    # m stores the maximum in the array
    m = 0
    for i in range(n):
        m = max(m, arr[i])
 
    # Frequency array
    freq = [0] * (m + 2)
    for i in range(n):
        freq[arr[i]] += 1
 
    # Sieve
    for i in range(1, m + 2):
        j = i
        cnt = 0
 
        # Incrementing j
        while (j <= m):
            cnt += freq[j]
            j += i
 
        # If no multiples of j are
        # in the array
        if (not cnt):
            return i
 
    return m + 1
 
# Driver code
arr = [2, 12, 6]
n = len(arr)
 
print(findMin(arr, n))
 
# This code is contributed by Mohit Kumar

C#

// C# implementation of the approach
using System;
 
class GFG
{
     
    // Function to return the smallest number
    // that divides minimum number of elements
    // in the given array
    static int findMin(int []arr, int n)
    {
        // m stores the maximum in the array
        int m = 0;
        for (int i = 0; i < n; i++)
            m = Math.Max(m, arr[i]);
     
        // Frequency array
        int []freq = new int[m + 2];
        for (int i = 0; i < n; i++)
            freq[arr[i]]++;
     
        // Sieve
        for (int i = 1; i <= m + 1; i++)
        {
            int j = i;
            int cnt = 0;
             
            // Incrementing j
            while (j <= m)
            {
                cnt += freq[j];
                j += i;
            }
     
            // If no multiples of j are
            // in the array
            if (cnt == 0)
                return i;
        }
        return m + 1;
    }
     
    // Driver code
    public static void Main ()
    {
        int []arr = { 2, 12, 6 };
        int n = arr.Length;
     
        Console.WriteLine(findMin(arr, n));
    }
}
 
// This code is contributed by AnkitRai01

Javascript

<script>
 
// Javascript implementation of the approach
 
// Function to return the smallest number
// that divides minimum number of elements
// in the given array
function findMin(arr, n)
{
    // m stores the maximum in the array
    var m = 0;
    for (var i = 0; i < n; i++)
        m = Math.max(m, arr[i]);
 
    // Frequency array
    var freq = Array(m+2).fill(0);
    for (var i = 0; i < n; i++)
        freq[arr[i]]++;
 
    // Sieve
    for (var i = 1; i <= m + 1; i++) {
        var j = i;
        var cnt = 0;
         
        // Incrementing j
        while (j <= m) {
            cnt += freq[j];
            j += i;
        }
 
        // If no multiples of j are
        // in the array
        if (!cnt)
            return i;
    }
 
    return m + 1;
}
 
// Driver code
var arr = [2, 12, 6];
var n = arr.length;
document.write( findMin(arr, n));
 
</script>

Producción:  

5

Complejidad temporal: O(Mlog(M) + N)

Espacio Auxiliar: O(1)
 

Publicación traducida automáticamente

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