# Minimize the difference between minimum and maximum elements

• Difficulty Level : Medium
• Last Updated : 13 May, 2021

Given an array of integers and an integer . It is allowed to modify an element either by increasing or decreasing them by k (only once).
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:

1. Find the max and min elements present in the array.
2. 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.
3. Calculate the average of the max and min elements of the array.
4. 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.
5. Return the difference between the max and min elements of the modified array.

Below is the implementation of above approach:

## C++

 `// C++ program to minimize the difference between``// minimum and maximum elements` `#include ``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

 `// 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`

## Python3

 `# 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#

 `// 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 */`

## PHP

 ` ``\$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``?>`

## Javascript

 ``
Output:
`Max height difference = 11`

Time Complexity: O( N )

My Personal Notes arrow_drop_up