Smallest number dividing minimum number of elements in the Array
Last Updated :
27 Feb, 2022
Given an array arr[] of N integers, the task is to find the smallest number that divides the minimum number of elements from the array.
Examples:
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
Approach: Let’s observe some details first. A number that divides zero elements already exists i.e. max(arr) + 1. Now, we just need to find the minimum number which divides zero numbers in the array.
In this article, an approach to solving this problem using square root factorization will be discussed. Each element will be factorised and a frequency array cnt[] of length max(arr) + 2 will be maintained to store the count of a number of elements in the array, for each element between 1 to max(arr) + 1.
- For each i, factorize arr[i].
- For each factor Fij of arr[i], update cnt[Fij] as cnt[Fij]++.
- Find the smallest number k in the frequency array cnt[] with cnt[k] = 0.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int findMin( int * arr, int n)
{
int m = 0;
for ( int i = 0; i < n; i++)
m = max(m, arr[i]);
int cnt[m + 2] = { 0 };
for ( int i = 0; i < n; i++) {
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]++;
}
}
}
for ( int i = 1; i <= m + 1; i++)
if (cnt[i] == 0) {
return i;
}
return -1;
}
int main()
{
int arr[] = { 2, 12, 6 };
int n = sizeof (arr) / sizeof ( int );
cout << findMin(arr, n);
return 0;
}
|
Java
class GFG
{
static int findMin( int arr[], int n)
{
int m = 0 ;
for ( int i = 0 ; i < n; i++)
m = Math.max(m, arr[i]);
int cnt[] = new int [m + 2 ];
for ( int i = 0 ; i < n; i++)
{
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]++;
}
}
}
}
for ( int i = 1 ; i <= m + 1 ; i++)
if (cnt[i] == 0 )
{
return i;
}
return - 1 ;
}
public static void main (String[] args)
{
int arr[] = { 2 , 12 , 6 };
int n = arr.length;
System.out.println(findMin(arr, n));
}
}
|
Python3
def findMin(arr, n):
m = 0
for i in range (n):
m = max (m, arr[i])
cnt = [ 0 ] * (m + 2 )
for i in range (n):
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
for i in range ( 1 , m + 2 ):
if (cnt[i] = = 0 ):
return i
return - 1
arr = [ 2 , 12 , 6 ]
n = len (arr)
print (findMin(arr, n))
|
C#
using System;
class GFG
{
static int findMin( int []arr, int n)
{
int m = 0;
for ( int i = 0; i < n; i++)
m = Math.Max(m, arr[i]);
int []cnt = new int [m + 2];
for ( int i = 0; i < n; i++)
{
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]++;
}
}
}
}
for ( int i = 1; i <= m + 1; i++)
if (cnt[i] == 0)
{
return i;
}
return -1;
}
public static void Main(String[] args)
{
int []arr = { 2, 12, 6 };
int n = arr.Length;
Console.WriteLine(findMin(arr, n));
}
}
|
Javascript
<script>
function findMin(arr, n)
{
var m = 0;
for ( var i = 0; i < n; i++)
m = Math.max(m, arr[i]);
var cnt = Array(m+2).fill(0);
for ( var i = 0; i < n; i++) {
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]++;
}
}
}
for ( var i = 1; i <= m + 1; i++)
if (cnt[i] == 0) {
return i;
}
return -1;
}
var arr = [2, 12, 6];
var n = arr.length;
document.write( findMin(arr, n));
</script>
|
Time Complexity: O(N * sqrt(max(arr))).
Auxiliary Space: O(max(arr))
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...