Minimize the Maximum Difference Between Heights
Understanding the Problem
The goal is to minimize the maximum difference between the heights of towers after modifying them within a given range.
Method 1: Sorting and Greedy Approach
This method sorts the array and then modifies heights by either increasing or decreasing within the given range.
import sys
def minimize_difference(arr, k):
arr.sort()
n = len(arr)
min_diff = arr[-1] - arr[0]
for i in range(1, n):
min_height = min(arr[0] + k, arr[i] - k)
max_height = max(arr[-1] - k, arr[i - 1] + k)
min_diff = min(min_diff, max_height - min_height)
return min_diff
arr = [1, 15, 10]
k = 6
print("Minimum difference:", minimize_difference(arr, k))
Output:
Minimum difference: 5
Method 2: Brute Force
This method tries all possibilities of adding or subtracting k from each element.
from itertools import product
def find_min_difference(arr, k):
n = len(arr)
min_diff = float('inf')
for signs in product([-1, 1], repeat=n):
modified_arr = [arr[i] + signs[i] * k for i in range(n)]
min_height = min(modified_arr)
max_height = max(modified_arr)
min_diff = min(min_diff, max_height - min_height)
return min_diff
arr = [1, 15, 10]
k = 6
print("Minimum difference:", find_min_difference(arr, k))
Output:
Minimum difference: 5
Method 3: Optimized Sorting Approach
An optimized approach that modifies heights while iterating through the sorted array.
def get_minimized_difference(arr, k):
arr.sort()
n = len(arr)
min_diff = arr[-1] - arr[0]
smallest, largest = arr[0] + k, arr[-1] - k
if smallest > largest:
smallest, largest = largest, smallest
for i in range(1, n - 1):
decrease = arr[i] - k
increase = arr[i] + k
if decrease >= smallest or increase <= largest:
continue
if largest - decrease <= increase - smallest:
smallest = decrease
else:
largest = increase
return min(min_diff, largest - smallest)
arr = [1, 15, 10]
k = 6
print("Minimum difference:", get_minimized_difference(arr, k))
Output:
Minimum difference: 5