You are given an array of n-elements, you have to find the number of operations needed to make all elements of array equal. Where a single operation can increment an element by k. If it is not possible to make all elements equal print -1.
Example :
Input : arr[] = {4, 7, 19, 16}, k = 3
Output : 10
Input : arr[] = {4, 4, 4, 4}, k = 3
Output : 0
Input : arr[] = {4, 2, 6, 8}, k = 3
Output : -1
To solve this question we require to check whether all elements can became equal or not and that too only by incrementing k from elements value. For this we have to check that the difference of any two elements should always be divisible by k. If it is so, then all elements can become equal otherwise they can not became equal in any case by incrementing k from them. Also, the number of operations required can be calculated by finding value of (max – Ai)/k for all elements. where max is maximum element of array.
Algorithm :
// iterate for all elements
for (int i=0; i<n; i++)
{
// check if element can make equal to max
// or not if not then return -1
if ((max - arr[i]) % k != 0 )
return -1;
// else update res for required operations
else
res += (max - arr[i]) / k ;
}
return res;
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int minOps( int arr[], int n, int k)
{
int max = *max_element(arr, arr + n);
int res = 0;
for ( int i = 0; i < n; i++) {
if ((max - arr[i]) % k != 0)
return -1;
else
res += (max - arr[i]) / k;
}
return res;
}
int main()
{
int arr[] = { 21, 33, 9, 45, 63 };
int n = sizeof (arr) / sizeof (arr[0]);
int k = 6;
cout << minOps(arr, n, k);
return 0;
}
|
Java
import java.io.*;
import java.util.Arrays;
class GFG {
static int minOps( int arr[], int n, int k)
{
int max = Integer.MIN_VALUE;
for ( int i= 0 ; i<n; i++) {
max = Math.max(max, arr[i]);
}
int res = 0 ;
for ( int i = 0 ; i < n; i++) {
if ((max - arr[i]) % k != 0 )
return - 1 ;
else
res += (max - arr[i]) / k;
}
return res;
}
public static void main(String[] args)
{
int arr[] = { 21 , 33 , 9 , 45 , 63 };
int n = arr.length;
int k = 6 ;
System.out.println(minOps(arr, n, k));
}
}
|
Python3
def minOps(arr, n, k):
max1 = max (arr)
res = 0
for i in range ( 0 , n):
if ((max1 - arr[i]) % k ! = 0 ):
return - 1
else :
res + = (max1 - arr[i]) / k
return int (res)
arr = [ 21 , 33 , 9 , 45 , 63 ]
n = len (arr)
k = 6
print (minOps(arr, n, k))
|
C#
using System;
class GFG {
static int minOps( int [] arr, int n, int k)
{
Array.Sort(arr);
int max = arr[arr.Length - 1];
int res = 0;
for ( int i = 0; i < n; i++) {
if ((max - arr[i]) % k != 0)
return -1;
else
res += (max - arr[i]) / k;
}
return res;
}
public static void Main()
{
int [] arr = { 21, 33, 9, 45, 63 };
int n = arr.Length;
int k = 6;
Console.Write(minOps(arr, n, k));
}
}
|
PHP
<?php
function minOps( $arr , $n , $k )
{
$max = max( $arr );
$res = 0;
for ( $i = 0; $i < $n ; $i ++)
{
if (( $max - $arr [ $i ]) % $k != 0)
return -1;
else
$res += ( $max -
$arr [ $i ]) / $k ;
}
return $res ;
}
$arr = array (21, 33, 9, 45, 63);
$n = count ( $arr );
$k = 6;
print (minOps( $arr , $n , $k ));
?>
|
Javascript
<script>
function minOps(arr, n, k)
{
var max = arr[0];
for ( var i=0; i<arr.length; i++)
{
if (arr[i]>max)
max = arr[i];
}
var res = 0;
for ( var i = 0; i < n; i++) {
if ((max - arr[i]) % k != 0)
return -1;
else
res += (max - arr[i]) / k;
}
return res;
}
var arr = [ 21, 33, 9, 45, 63 ];
var n = arr.length;
var k = 6;
document.write( minOps(arr, n, k));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
19 May, 2023
Like Article
Save Article