给定一个由N个整数组成的数组arr [] ,任务是找到最小的数,该数将数组中元素的最小数量相除。
例子:
Input: arr[] = {2, 12, 6}
Output: 5
Here, 1 divides 3 elements
2 divides 3 elements
3 divides 2 elements
4 divides 1 element
5 divides no element
6 divides 2 elements
7 divides no element
8 divides no element
9 divides no element
10 divides no element
11 divides no element
12 divides 1 element
5 is the smallest number not dividing any
number in the array. Thus, ans = 5
Input: arr[] = {1, 7, 9}
Output: 2
方法:让我们先观察一些细节。将零元素相除的数字已经存在,即max(arr)+ 1 。现在,我们只需要找到将数组中的零数相除的最小数即可。
在本文中,将讨论使用平方根分解来解决此问题的方法。每个元素将被分解,并且长度为max(arr)+ 2的频率数组cnt []将被保存,以存储数组中元素的数量计数,范围是1到max(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)))。