Find K such that repeated subtraction of K from Array elements make the Array equal
Given an array arr[] of size N, the task is to find the value of an integer K such that its repeated subtraction from array elements will make all array elements in minimum operations.
Example:
Input: arr[] = {5, 3, 3, 7}
Output: 2
Explanation: Minimum 2 operations must be performed:
1st operation: subtract 2 from elements at indices {0, 3}, arr[] = {3, 3, 3, 5}
2nd operation: subtract 2 from element at index 3, arr[] = {3, 3, 3, 3}
So, the value of K = 2
Input: arr[] = {-1, 0, -1, 0, -1}
Output: 1
Approach: To make all elements in the array arr equal, all elements need to be changed to the smallest value in the array. So, the gcd of the difference of all array elements to the smallest element will be the value of K. Now, to solve the following problem, follow the below steps:
- Create a variable mn to store the minimum element in the array arr.
- Now, traverse the array arr and find the gcd of the differences between all array elements and mn. Store this value in a variable K.
- Return K, as the answer to this question.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int findtheValue( int arr[], int N)
{
int mn = *min_element(arr, arr + N);
int K = arr[0] - mn;
for ( int i = 1; i < N; ++i) {
K = __gcd(K, arr[i] - mn);
}
return K;
}
int main()
{
int arr[] = { 5, 3, 3, 7 };
int N = sizeof (arr) / sizeof (arr[0]);
cout << findtheValue(arr, N);
return 0;
}
|
Java
class GFG {
static int gcd( int a, int b)
{
if (b == 0 )
return a;
return gcd(b, a % b);
}
public static int getMin( int [] inputArray){
int minValue = inputArray[ 0 ];
for ( int i = 1 ; i < inputArray.length; i++){
if (inputArray[i] < minValue){
minValue = inputArray[i];
}
}
return minValue;
}
static int findtheValue( int [] arr, int N)
{
int mn = getMin(arr);
int K = arr[ 0 ] - mn;
for ( int i = 1 ; i < N; ++i) {
K = gcd(K, arr[i] - mn);
}
return K;
}
public static void main(String args[])
{
int [] arr = { 5 , 3 , 3 , 7 };
int N = arr.length;
System.out.println(findtheValue(arr, N));
}
}
|
Python3
import math
def findtheValue(arr, N):
mn = min (arr)
K = arr[ 0 ] - mn
for i in range ( 1 , N):
K = math.gcd(K, arr[i] - mn)
return K
if __name__ = = "__main__" :
arr = [ 5 , 3 , 3 , 7 ]
N = len (arr)
print (findtheValue(arr, N))
|
C#
using System;
using System.Linq;
class GFG {
static int gcd( int a, int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
static int findtheValue( int [] arr, int N)
{
int mn = arr.Min();
int K = arr[0] - mn;
for ( int i = 1; i < N; ++i) {
K = gcd(K, arr[i] - mn);
}
return K;
}
public static void Main()
{
int [] arr = { 5, 3, 3, 7 };
int N = arr.Length;
Console.WriteLine(findtheValue(arr, N));
}
}
|
Javascript
<script>
let gcd = function (a, b) {
if (!b) {
return a;
}
return gcd(b, a % b);
}
function findtheValue(arr, N)
{
let mn = Math.min(...arr)
let K = arr[0] - mn;
for (let i = 1; i < N; ++i) {
K = gcd(K, arr[i] - mn);
}
return K;
}
let arr = [ 5, 3, 3, 7 ]
let N = arr.length
document.write(findtheValue(arr, N))
</script>
|
Time Complexity: O(Nlog(mn))
Auxiliary Space: O(1)
Last Updated :
14 Jan, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...