📌  相关文章
📜  最小化高度之间的最大差异

📅  最后修改于: 2021-04-24 17:49:24             🧑  作者: Mango

给定n个塔的高度和值k。我们需要将每个塔的高度增加或减少k(仅一次),其中k>0。任务是使修改后最长和最短塔的高度之间的差异最小化,并输出该差异。
例子:

Input  : arr[] = {1, 15, 10}, k = 6
Output :  Maximum difference is 2.
Explanation : We change 1 to 7, 15 to 
9 and 10 to 4. Maximum difference is 5
(between 7 and 9). We can't get a lower
difference.

Input : arr[] = {1, 5, 15, 10} 
        k = 3   
Output : Maximum difference is 8
arr[] = {4, 8, 12, 7}

Input : arr[] = {4, 6} 
        k = 10
Output : Maximum difference is 2
arr[] = {14, 16} OR {-6, -4}

Input : arr[] = {6, 10} 
        k = 3
Output : Maximum difference is 2
arr[] = {9, 7} 

Input : arr[] = {1, 10, 14, 14, 14, 15}
        k = 6 
Output: Maximum difference is 5
arr[] = {7, 4, 8, 8, 8, 9} 

Input : arr[] = {1, 2, 3}
        k = 2 
Output: Maximum difference is 2
arr[] = {3, 4, 5} 

资料来源:Adobe面试体验|设置24(MTS校园)

想法是对所有元素按升序进行排序。对于所有元素,请检查减(element-k)和加(element + k)是否进行任何更改。
下面是上述方法的实现:

C++
// C++ program to find the minimum possible
// difference between maximum and minimum
// elements when we have to add/subtract
// every number by k
#include 
using namespace std;
 
// Modifies the array by subtracting/adding
// k to every element such that the difference
// between maximum and minimum is minimized
int getMinDiff(int arr[], int n, int k)
{
    if (n == 1)
       return 0;
 
    // Sort all elements
    sort(arr, arr+n);
 
    // Initialize result
    int ans = arr[n-1] - arr[0];
 
    // Handle corner elements
    int small = arr[0] + k;
    int big = arr[n-1] - k;
    if (small > big)
       swap(small, big);
 
    // Traverse middle elements
    for (int i = 1; i < n-1; i ++)
    {
        int subtract = arr[i] - k;
        int add = arr[i] + k;
 
        // If both subtraction and addition
        // do not change diff
        if (subtract >= small || add <= big)
            continue;
 
        // Either subtraction causes a smaller
        // number or addition causes a greater
        // number. Update small or big using
        // greedy approach (If big - subtract
        // causes smaller diff, update small
        // Else update big)
        if (big - subtract <= add - small)
            small = subtract;
        else
            big = add;
    }
 
    return  min(ans, big - small);
}
 
// Driver function to test the above function
int main()
{
    int arr[] = {4, 6};
    int n = sizeof(arr)/sizeof(arr[0]);
    int k = 10;
    cout << "\nMaximum difference is "
        << getMinDiff(arr, n, k);
    return 0;
}


Java
// Java program to find the minimum possible
// difference between maximum and minimum
// elements when we have to add/subtract
// every number by k
import java.util.*;
 
class GFG {
 
    // Modifies the array by subtracting/adding
    // k to every element such that the difference
    // between maximum and minimum is minimized
    static int getMinDiff(int arr[], int n, int k)
    {
        if (n == 1)
        return 0;
 
        // Sort all elements
        Arrays.sort(arr);
 
        // Initialize result
        int ans = arr[n-1] - arr[0];
 
        // Handle corner elements
        int small = arr[0] + k;
        int big = arr[n-1] - k;
        int temp = 0;
         
        if (small > big)
        {
            temp = small;
            small = big;
            big = temp;
        }
 
        // Traverse middle elements
        for (int i = 1; i < n-1; i ++)
        {
            int subtract = arr[i] - k;
            int add = arr[i] + k;
 
            // If both subtraction and addition
            // do not change diff
            if (subtract >= small || add <= big)
                continue;
 
            // Either subtraction causes a smaller
            // number or addition causes a greater
            // number. Update small or big using
            // greedy approach (If big - subtract
            // causes smaller diff, update small
            // Else update big)
            if (big - subtract <= add - small)
                small = subtract;
            else
                big = add;
        }
 
        return Math.min(ans, big - small);
    }
 
    // Driver function to test the above function
    public static void main(String[] args)
    {
        int arr[] = {4, 6};
        int n = arr.length;
        int k = 10;
        System.out.println("Maximum difference is "+
                            getMinDiff(arr, n, k));
    }
}
// This code is contributed by Prerna Saini


Python3
# Python 3 program to find the minimum
# possible difference between maximum
# and minimum elements when we have to
# add / subtract every number by k
 
# Modifies the array by subtracting /
# adding k to every element such that
# the difference between maximum and
# minimum is minimized
def getMinDiff(arr, n, k):
 
    if (n == 1):
        return 0
 
    # Sort all elements
    arr.sort()
 
    # Initialize result
    ans = arr[n-1] - arr[0]
 
    # Handle corner elements
    small = arr[0] + k
    big = arr[n-1] - k
     
    if (small > big):
        small, big = big, small
 
    # Traverse middle elements
    for i in range(1, n-1):
     
        subtract = arr[i] - k
        add = arr[i] + k
 
        # If both subtraction and addition
        # do not change diff
        if (subtract >= small or add <= big):
            continue
 
        # Either subtraction causes a smaller
        # number or addition causes a greater
        # number. Update small or big using
        # greedy approach (If big - subtract
        # causes smaller diff, update small
        # Else update big)
        if (big - subtract <= add - small):
            small = subtract
        else:
            big = add
     
 
    return min(ans, big - small)
 
 
# Driver function
arr = [ 4, 6 ]
n = len(arr)
k = 10
 
print("Maximum difference is", getMinDiff(arr, n, k))
 
# This code is contributed by
# Smitha Dinesh Semwal


C#
// C# program to find the minimum
// possible difference between
// maximum and minimum elements
// when we have to add/subtract
// every number by k
using System;
 
class GFG
{
 
// Modifies the array by subtracting/adding
// k to every element such that the difference
// between maximum and minimum is minimized
static int getMinDiff(int[] arr, int n, int k)
{
    if (n == 1)
    return 0;
 
    // Sort all elements
    Array.Sort(arr);
 
    // Initialize result
    int ans = arr[n - 1] - arr[0];
 
    // Handle corner elements
    int small = arr[0] + k;
    int big = arr[n - 1] - k;
    int temp = 0;
     
    if (small > big)
    {
        temp = small;
        small = big;
        big = temp;
    }
 
    // Traverse middle elements
    for (int i = 1; i < n - 1; i ++)
    {
        int subtract = arr[i] - k;
        int add = arr[i] + k;
 
        // If both subtraction and
        // addition do not change diff
        if (subtract >= small || add <= big)
            continue;
 
        // Either subtraction causes a smaller
        // number or addition causes a greater
        // number. Update small or big using
        // greedy approach (If big - subtract
        // causes smaller diff, update small
        // Else update big)
        if (big - subtract <= add - small)
            small = subtract;
        else
            big = add;
    }
 
    return Math.Min(ans, big - small);
}
 
// Driver Code
public static void Main()
{
    int[] arr = {4, 6};
    int n = arr.Length;
    int k = 10;
    Console.Write("Maximum difference is "+
                    getMinDiff(arr, n, k));
}
}
 
// This code is contributed
// by ChitraNayal


PHP
 $big)
    {
        $temp = $small;
        $small = $big;
        $big = $temp;
    }
     
    // Traverse middle elements
    for ($i = 1; $i < $n - 1; $i ++)
    {
        $subtract = $arr[$i] - $k;
        $add = $arr[$i] + $k;
 
        // If both subtraction and
        // addition do not change diff
        if ($subtract >= $small || $add <= $big)
            continue;
 
        // Either subtraction causes a smaller
        // number or addition causes a greater
        // number. Update small or big using
        // greedy approach (If big - subtract
        // causes smaller diff, update small
        // Else update big)
        if ($big - $subtract <= $add - $small)
            $small = $subtract;
        else
            $big = $add;
    }
 
    return min($ans, $big - $small);
}
 
// Driver Code
$arr = array(4, 6);
$n = sizeof($arr);
$k = 10;
echo "Maximum difference is ";
echo getMinDiff($arr, $n, $k);
 
// This code is contributed by ihritik
?>


Javascript


输出 :

Maximum difference is 2