📜  最小数除以数组中的最小元素数

📅  最后修改于: 2021-05-07 06:53:46             🧑  作者: Mango

给定一个由N个整数组成的数组arr [] ,任务是找到最小的数,该数将数组中元素的最小数量相除。

例子:

方法:让我们先观察一些细节。将零元素相除的数字已经存在,即max(arr)+ 1 。现在,我们只需要找到将数组中的零数相除的最小数即可。

在本文中,将讨论使用平方根分解来解决此问题的方法。每个元素将被分解,并且长度为max(arr)+ 2的频率数组cnt []将被保存,以存储数组中元素的数量计数,范围是1max(arr)+ 1之间的元素。

  • 对于每个i ,分解arr [i]
  • 对于arr [i]的每个因子Fij ,将cnt [Fij]更新为cnt [Fij] ++
  • cnt [k] = 0的频率数组cnt []中找到最小的数k

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
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


输出:
5

时间复杂度: O(N * sqrt(max(arr)))。