Minimum number of given operations required to reduce the array to 0 element
Last Updated :
13 Jun, 2022
Given an array arr[] of N integers. The task is to find the minimum number of given operations required to reduce the array to 0 elements. In a single operation, any element can be chosen from the array and all of its multiples get removed including itself.
Examples:
Input: arr[] = {2, 4, 6, 3, 4, 6, 8}
Output: 2
Operation 1: Choose 2 and delete all the multiples, arr[] = {3}
Operation 3: Choose 3 and the array gets reduced to 0 element.
Input: arr[] = {2, 4, 2, 4, 4, 4}
Output: 1
Naive approach: Find minimum from the array at each step and traverse the entire array to find multiples of these elements and delete them.
Efficient approach:
- Create a count array that stores the count of each number in the array.
- Since we know that for a number x the elements which satisfy the condition (A % x == 0) are actually the multiples of x and hence we need to find the multiples for every number and set their frequencies to 0 including the chosen element itself.
- Now for every number, we traverse its multiples once and subtract the value of the count of that number from all of its multiples.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int minOperations( int * arr, int n)
{
int maxi, result = 0;
vector< int > freq(1000001, 0);
for ( int i = 0; i < n; i++) {
int x = arr[i];
freq[x]++;
}
maxi = *(max_element(arr, arr + n));
for ( int i = 1; i <= maxi; i++) {
if (freq[i] != 0) {
for ( int j = i * 2; j <= maxi; j = j + i) {
freq[j] = 0;
}
result++;
}
}
return result;
}
int main()
{
int arr[] = { 2, 4, 2, 4, 4, 4 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << minOperations(arr, n);
return 0;
}
|
Java
import java.util.Arrays;
class GFG
{
static int minOperations( int [] arr, int n)
{
int maxi, result = 0 ;
int [] freq = new int [ 1000001 ];
for ( int i = 0 ; i < n; i++)
{
int x = arr[i];
freq[x]++;
}
maxi = Arrays.stream(arr).max().getAsInt();
for ( int i = 1 ; i <= maxi; i++)
{
if (freq[i] != 0 )
{
for ( int j = i * 2 ; j <= maxi; j = j + i)
{
freq[j] = 0 ;
}
result++;
}
}
return result;
}
public static void main(String[] args)
{
int arr[] = { 2 , 4 , 2 , 4 , 4 , 4 };
int n = arr.length;
System.out.println(minOperations(arr, n));
}
}
|
Python3
def minOperations(arr, n):
result = 0
freq = [ 0 ] * 1000001
for i in range ( 0 , n):
freq[arr[i]] + = 1
maxi = max (arr)
for i in range ( 1 , maxi + 1 ):
if freq[i] ! = 0 :
for j in range (i * 2 , maxi + 1 , i):
freq[j] = 0
result + = 1
return result
if __name__ = = "__main__" :
arr = [ 2 , 4 , 2 , 4 , 4 , 4 ]
n = len (arr)
print (minOperations(arr, n))
|
C#
using System;
using System.Linq;
class GFG
{
static int minOperations( int [] arr, int n)
{
int maxi, result = 0;
int [] freq = new int [1000001];
for ( int i = 0; i < n; i++)
{
int x = arr[i];
freq[x]++;
}
maxi = arr.Max();
for ( int i = 1; i <= maxi; i++)
{
if (freq[i] != 0)
{
for ( int j = i * 2; j <= maxi; j = j + i)
{
freq[j] = 0;
}
result++;
}
}
return result;
}
public static void Main(String[] args)
{
int []arr = {2, 4, 2, 4, 4, 4};
int n = arr.Length;
Console.WriteLine(minOperations(arr, n));
}
}
|
PHP
<?php
function minOperations( $arr , $n )
{
$result = 0;
$freq = array ();
for ( $i = 0; $i < $n ; $i ++)
{
$freq [ $arr [ $i ]] = 0;
}
for ( $i = 0; $i < $n ; $i ++)
{
$x = $arr [ $i ];
$freq [ $x ]++;
}
$maxi = max( $arr );
for ( $i = 1; $i <= $maxi ; $i ++)
{
if ( $freq [ $i ] != 0)
{
for ( $j = $i * 2;
$j <= $maxi ; $j = $j + $i )
{
$freq [ $j ] = 0;
}
$result ++;
}
}
return $result ;
}
$arr = array ( 2, 4, 2, 4, 4, 4 );
$n = count ( $arr );
echo minOperations( $arr , $n );
?>
|
Javascript
<script>
function minOperations(arr, n)
{
let maxi, result = 0;
let freq = new Array(1000001).fill(0);
for (let i = 0; i < n; i++) {
let x = arr[i];
freq[x]++;
}
maxi = Math.max(...arr);
for (let i = 1; i <= maxi; i++) {
if (freq[i] != 0) {
for (let j = i * 2; j <= maxi; j = j + i) {
freq[j] = 0;
}
result++;
}
}
return result;
}
let arr = [ 2, 4, 2, 4, 4, 4 ];
let n = arr.length;
document.write(minOperations(arr, n));
</script>
|
Time Complexity: O(n + m?m), where n represents the size of the given array and m represents the maximum element in the array.
Auxiliary Space: O(1000001), no extra space is required, so it is a constant.
Share your thoughts in the comments
Please Login to comment...