Given an array of
The task is to minimize and print the maximum difference between the shortest and longest towers.
Examples:
Input: arr[] = {1, 10, 8, 5}, k = 2
Output : Max height difference = 5
Explanation:
modified arr[]={3, 8, 6, 7}
max difference: 5
Input: arr[] = {3, 16, 12, 9, 20}, k = 3
Output : Max height difference: 11
Approach:
- Find the max and min elements present in the array.
- Check whether the difference between the max and min element is less than or equal to k or not:
- If yes, then return the difference between the max and min element.
- otherwise, go to step 3.
- Calculate the average of the max and min elements of the array.
- Traverse the array and do the following operations:
- If the array element is greater than the average then decrease it by k.
- If the array element is smaller than the average then increase it by k.
- Return the difference between the max and min elements of the modified array.
Try it on GfG Practice
Below is the implementation of above approach:
// C++ program to minimize the difference between
// minimum and maximum elements
#include <bits/stdc++.h>
using namespace std;
// Function to minimize the difference between
// minimum and maximum elements
int minimizeDiff(int* arr, int n, int k)
{
// Find max and min elements of the array
int max = *(max_element(arr, arr + n));
int min = *(min_element(arr, arr + n));
// Check whether the difference between
// the max and min element is less than
// or equal to k or not
if ((max - min) <= k) {
return (max - min);
}
// Calculate average of max and min
int avg = (max + min) / 2;
for (int i = 0; i < n; i++) {
// If the array element is greater than the
// average then decrease it by k
if (arr[i] > avg)
arr[i] -= k;
// If the array element is smaller than the
// average then increase it by k
else
arr[i] += k;
}
// Find max and min of the modified array
max = *(max_element(arr, arr + n));
min = *(min_element(arr, arr + n));
// return the new difference
return (max - min);
}
// Driver code
int main()
{
int arr[] = { 3, 16, 12, 9, 20 };
int n = 5;
int k = 3;
cout << "Max height difference = "
<< minimizeDiff(arr, n, k) << endl;
return 0;
}
// Java program to minimize the difference between
// minimum and maximum elements
import java.util.*;
class GFG
{
// Function to minimize the difference between
// minimum and maximum elements
static int minimizeDiff(int[] arr, int n, int k)
{
// Find max and min elements of the array
int max = Arrays.stream(arr).max().getAsInt();
int min = Arrays.stream(arr).min().getAsInt();
// Check whether the difference between
// the max and min element is less than
// or equal to k or not
if ((max - min) <= k)
{
return (max - min);
}
// Calculate average of max and min
int avg = (max + min) / 2;
for (int i = 0; i < n; i++)
{
// If the array element is greater than the
// average then decrease it by k
if (arr[i] > avg)
{
arr[i] -= k;
}
// If the array element is smaller than the
// average then increase it by k
else
{
arr[i] += k;
}
}
// Find max and min of the modified array
max = Arrays.stream(arr).max().getAsInt();
min = Arrays.stream(arr).min().getAsInt();
// return the new difference
return (max - min);
}
// Driver code
public static void main(String[] args)
{
int arr[] = {3, 16, 12, 9, 20};
int n = 5;
int k = 3;
System.out.println("Max height difference = "
+ minimizeDiff(arr, n, k));
}
}
// This code has been contributed by 29AjayKumar
# Python 3 program to minimize the
# difference between minimum and
# maximum elements
# Function to minimize the difference
# between minimum and maximum elements
def minimizeDiff(arr, n, k) :
# Find max and min elements
# of the array
max_element = max(arr)
min_element = min(arr)
# Check whether the difference between
# the max and min element is less than
# or equal to k or not
if ((max_element - min_element) <= k) :
return (max_element - min_element)
# Calculate average of max and min
avg = (max_element + min_element) // 2
for i in range(n):
# If the array element is greater than
# the average then decrease it by k
if (arr[i] > avg) :
arr[i] -= k
# If the array element is smaller than
# the average then increase it by k
else :
arr[i] += k
# Find max and min of the
# modified array
max_element = max(arr)
min_element = min(arr)
# return the new difference
return (max_element - min_element);
# Driver code
if __name__ == "__main__" :
arr = [ 3, 16, 12, 9, 20 ]
n = 5
k = 3
print("Max height difference =",
minimizeDiff(arr, n, k))
# This code is contributed by Ryuga
// C# program to minimize the difference between
// minimum and maximum elements
using System;
using System.Linq;
class GFG
{
// Function to minimize the difference between
// minimum and maximum elements
static int minimizeDiff(int[] arr, int n, int k)
{
// Find max and min elements of the array
int max = arr.Max();
int min = arr.Min();
// Check whether the difference between
// the max and min element is less than
// or equal to k or not
if ((max - min) <= k)
{
return (max - min);
}
// Calculate average of max and min
int avg = (max + min) / 2;
for (int i = 0; i < n; i++)
{
// If the array element is greater than the
// average then decrease it by k
if (arr[i] > avg)
{
arr[i] -= k;
}
// If the array element is smaller than the
// average then increase it by k
else
{
arr[i] += k;
}
}
// Find max and min of the modified array
max = arr.Max();
min = arr.Min();
// return the new difference
return (max - min);
}
// Driver code
public static void Main()
{
int []arr = {3, 16, 12, 9, 20};
int n = 5;
int k = 3;
Console.WriteLine("Max height difference = "
+ minimizeDiff(arr, n, k));
}
}
/* This code contributed by PrinciRaj1992 */
<script>
// Javascript program to minimize
// the difference between
// minimum and maximum elements
// Function to minimize the difference between
// minimum and maximum elements
function minimizeDiff(arr,n,k)
{
// Find max and min elements of the array
let max = Math.max(...arr);
let min = Math.min(...arr);
// Check whether the difference between
// the max and min element is less than
// or equal to k or not
if ((max - min) <= k)
{
return (max - min);
}
// Calculate average of max and min
let avg = Math.floor((max + min) / 2);
for (let i = 0; i < n; i++)
{
// If the array element is greater than the
// average then decrease it by k
if (arr[i] > avg)
{
arr[i] -= k;
}
// If the array element is smaller than the
// average then increase it by k
else
{
arr[i] += k;
}
}
// Find max and min of the modified array
max = Math.max(...arr);
min = Math.min(...arr);
// return the new difference
return (max - min);
}
// Driver code
let arr=[3, 16, 12, 9, 20];
let n = 5;
let k = 3;
document.write("Max height difference = "
+ minimizeDiff(arr, n, k));
// This code is contributed by avanitrachhadiya2155
</script>
<?php
// PHP program to minimize the difference
// between minimum and maximum elements
// Function to minimize the difference
// between minimum and maximum elements
function minimizeDiff(&$arr, $n, $k)
{
// Find max and min elements
// of the array
$max = max($arr);
$min = min($arr);
// Check whether the difference between
// the max and min element is less than
// or equal to k or not
if (($max - $min) <= $k)
{
return ($max - $min);
}
// Calculate average of max and min
$avg = ($max + $min) / 2;
for ($i = 0; $i < $n; $i++)
{
// If the array element is greater than
// the average then decrease it by k
if ($arr[$i] > $avg)
$arr[$i] -= $k;
// If the array element is smaller than
// the average then increase it by k
else
$arr[$i] += $k;
}
// Find max and min of the
// modified array
$max = max($arr);
$min = min($arr);
// return the new difference
return ($max - $min);
}
// Driver code
$arr = array( 3, 16, 12, 9, 20 );
$n = 5;
$k = 3;
echo "Max height difference = " .
minimizeDiff($arr, $n, $k). "\n";
// This code is contributed by ita_c
?>
Output
Max height difference = 11
Time Complexity: O( N )
Space Complexity: O( 1 )