Número más pequeño que divide el número mínimo de elementos en la array – Part 1

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 utilizando la factorización de raíces cuadradas. Cada elemento se factorizará y se mantendrá una array de frecuencias cnt[] de longitud max(arr) + 2 para almacenar el recuento de una cantidad de elementos en la array, para cada elemento entre 1 y max(arr) + 1 .
 

  • Para cada i , factorice arr[i] .
  • Para cada factor Fij de arr[i] , actualice cnt[Fij] como cnt[Fij]++ .
  • Encuentre el número más pequeño k en la array de frecuencias cnt[] con cnt[k] = 0 .

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
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 table
    int cnt[m + 2] = { 0 };
 
    // Loop to factorize
    for (int i = 0; i < n; i++) {
 
        // sqrt factorization of the numbers
        for (int j = 1; j * j <= arr[i]; j++) {
            if (arr[i] % j == 0) {
                if (j * j == arr[i])
                    cnt[j]++;
                else
                    cnt[j]++, cnt[arr[i] / j]++;
            }
        }
    }
 
    // Finding the smallest number
    // with zero multiples
    for (int i = 1; i <= m + 1; i++)
        if (cnt[i] == 0) {
            return i;
        }
 
    return -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
    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 table
        int cnt[] = new int[m + 2];
     
        // Loop to factorize
        for (int i = 0; i < n; i++)
        {
     
            // sqrt factorization of the numbers
            for (int j = 1; j * j <= arr[i]; j++)
            {
                if (arr[i] % j == 0)
                {
                    if (j * j == arr[i])
                        cnt[j]++;
                    else
                    {
                        cnt[j]++;
                        cnt[arr[i] / j]++;
                    }
                }
            }
        }
     
        // Finding the smallest number
        // with zero multiples
        for (int i = 1; i <= m + 1; i++)
            if (cnt[i] == 0)
            {
                return i;
            }
        return -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
def findMin(arr, n):
     
    # m stores the maximum in the array
    m = 0
    for i in range(n):
        m = max(m, arr[i])
 
    # Frequency table
    cnt = [0] * (m + 2)
 
    # Loop to factorize
    for i in range(n):
 
        # sqrt factorization of the numbers
        j = 1
        while j * j <= arr[i]:
 
            if (arr[i] % j == 0):
                if (j * j == arr[i]):
                    cnt[j] += 1
                else:
                    cnt[j] += 1
                    cnt[arr[i] // j] += 1
            j += 1   
 
    # Finding the smallest number
    # with zero multiples
    for i in range(1, m + 2):
        if (cnt[i] == 0):
            return i
 
    return -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
    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 table
        int []cnt = new int[m + 2];
     
        // Loop to factorize
        for (int i = 0; i < n; i++)
        {
     
            // sqrt factorization of the numbers
            for (int j = 1; j * j <= arr[i]; j++)
            {
                if (arr[i] % j == 0)
                {
                    if (j * j == arr[i])
                        cnt[j]++;
                    else
                    {
                        cnt[j]++;
                        cnt[arr[i] / j]++;
                    }
                }
            }
        }
     
        // Finding the smallest number
        // with zero multiples
        for (int i = 1; i <= m + 1; i++)
            if (cnt[i] == 0)
            {
                return i;
            }
        return -1;
    }
     
    // Driver code
    public static void Main(String[] args)
    {
        int []arr = { 2, 12, 6 };
        int n = arr.Length;
     
        Console.WriteLine(findMin(arr, n));
    }
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
 
// Javascript implementation of the approach
 
// Function to return the smallest number
// that divides minimum number of elements
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 table
    var cnt = Array(m+2).fill(0);
 
    // Loop to factorize
    for (var i = 0; i < n; i++) {
 
        // sqrt factorization of the numbers
        for (var j = 1; j * j <= arr[i]; j++) {
            if (arr[i] % j == 0) {
                if (j * j == arr[i])
                    cnt[j]++;
                else
                    cnt[j]++, cnt[arr[i] / j]++;
            }
        }
    }
 
    // Finding the smallest number
    // with zero multiples
    for (var i = 1; i <= m + 1; i++)
        if (cnt[i] == 0) {
            return i;
        }
 
    return -1;
}
 
// Driver code
var arr = [2, 12, 6];
var n = arr.length;
document.write( findMin(arr, n));
 
</script>
Producción: 

5

 

Complejidad de tiempo: O(N * sqrt(max(arr))).

Espacio auxiliar: O(max(arr))
 

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 *