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)