Minimize the maximum minimum difference after one removal from array

• Difficulty Level : Basic
• Last Updated : 16 Mar, 2021

Given an array arr[] of size n ≥ 3, the task is to find the minimum possible difference between the maximum and the minimum element from the array after removing one element.
Examples:

Input: arr[] = {1, 2, 3}
Output:
Removing 1 will give 3 – 2 = 1
Removing 2, 3 – 1 = 2
And removing 3 will result in 2 – 1 = 1
Input: arr[] = {1, 2, 4, 3, 4}
Output:

Naive Approach: It is clear that to have an effect on the difference only the minimum or the maximum element has to be removed.

• Sort the array.
• Remove the minimum, store diff1 = arr[n – 1] – arr.
• Remove the maximum, and diff2 = arr[n – 2] – arr.
• Print min(diff1, diff2) in the end.

Below is the implementation of the above approach:

C++

 // C++ implementation of the approach#include using namespace std; // Function to return the minimum required differenceint findMinDifference(int arr[], int n){    // Sort the given array    sort(arr, arr + n);     // When minimum element is removed    int diff1 = arr[n - 1] - arr;     // When maximum element is removed    int diff2 = arr[n - 2] - arr;     // Return the minimum of diff1 and diff2    return min(diff1, diff2);} // Driver Codeint main(){    int arr[] = { 1, 2, 4, 3, 4 };    int n = sizeof(arr) / sizeof(arr);     cout << findMinDifference(arr, n);     return 0;}

Java

 // Java implementation of the approachimport java.util.*; class solution{ // Function to return the minimum required differencestatic int findMinDifference(int arr[], int n){    // Sort the given array    Arrays.sort(arr);     // When minimum element is removed    int diff1 = arr[n - 1] - arr;     // When maximum element is removed    int diff2 = arr[n - 2] - arr;     // Return the minimum of diff1 and diff2    return Math.min(diff1, diff2);} // Driver Codepublic static void  main(String args[]){    int arr[] = { 1, 2, 4, 3, 4 };    int n = arr.length;     System.out.print(findMinDifference(arr, n)); }}// This code is contributed by// Sanjit_Prasad

Python3

 # Python3 implementation of the approach # Function to return the minimum# required differencedef findMinDifference(arr, n) :     # Sort the given array    arr.sort()     # When minimum element is removed    diff1 = arr[n - 1] - arr     # When maximum element is removed    diff2 = arr[n - 2] - arr     # Return the minimum of diff1 and diff2    return min(diff1, diff2) # Driver Codeif __name__ == "__main__" :     arr = [ 1, 2, 4, 3, 4 ]    n = len(arr)     print(findMinDifference(arr, n)) # This code is contributed by Ryuga

C#

 // C# implementation of the approachusing System; public class GFG{     // Function to return the minimum required differencestatic int findMinDifference(int []arr, int n){    // Sort the given array    Array.Sort(arr);     // When minimum element is removed    int diff1 = arr[n - 1] - arr;     // When maximum element is removed    int diff2 = arr[n - 2] - arr;     // Return the minimum of diff1 and diff2    return Math.Min(diff1, diff2);} // Driver Code    static public void Main (){         int []arr = { 1, 2, 4, 3, 4 };    int n = arr.Length;     Console.Write(findMinDifference(arr, n)); }}// This code is contributed by Sachin..



Javascript


Output:
2

Efficient Approach: In order to find the min, secondMin, max and secondMax elements from the array. We don’t need to sort the array, it can be done in a single array traversal.
Below is the implementation of the above approach:

C++

 // C++ implementation of the approach#includeusing namespace std; // Function to return the minimum required differenceint findMinDifference(int arr[], int n){    int min__, secondMin, max__, secondMax;     min__ = secondMax = (arr < arr) ? arr : arr;    max__ = secondMin = (arr < arr) ? arr : arr;     for (int i = 2; i < n; i++)    {        // If current element is greater than max        if (arr[i] > max__)        {            // max will become secondMax            secondMax = max__;             // Update the max            max__ = arr[i];        }         // If current element is greater than secondMax        // but smaller than max        else if (arr[i] > secondMax)        {             // Update the secondMax            secondMax = arr[i];        }         // If current element is smaller than min        else if (arr[i] < min__)        {             // min will become secondMin            secondMin = min__;             // Update the min            min__ = arr[i];        }         // If current element is smaller than secondMin        // but greater than min        else if (arr[i] < secondMin) {                             // Update the secondMin            secondMin = arr[i];        }    }     // Minimum of the two possible differences    int diff = min(max__ - secondMin, secondMax - min__);    return diff;} // Driver codeint main(){    int arr[] = { 1, 2, 4, 3, 4 };    int n = sizeof(arr)/sizeof(arr);    cout << (findMinDifference(arr, n));}     // This code is contributed by// Shashank_Sharma

Java

 // Java implementation of the approachpublic class GFG {     // Function to return the minimum required difference    static int findMinDifference(int arr[], int n)    {        int min, secondMin, max, secondMax;         min = secondMax = (arr < arr) ? arr : arr;        max = secondMin = (arr < arr) ? arr : arr;         for (int i = 2; i < n; i++) {             // If current element is greater than max            if (arr[i] > max) {                 // max will become secondMax                secondMax = max;                 // Update the max                max = arr[i];            }             // If current element is greater than secondMax            // but smaller than max            else if (arr[i] > secondMax) {                 // Update the secondMax                secondMax = arr[i];            }             // If current element is smaller than min            else if (arr[i] < min) {                 // min will become secondMin                secondMin = min;                 // Update the min                min = arr[i];            }             // If current element is smaller than secondMin            // but greater than min            else if (arr[i] < secondMin) {                 // Update the secondMin                secondMin = arr[i];            }        }         // Minimum of the two possible differences        int diff = Math.min(max - secondMin, secondMax - min);         return diff;    }     // Driver code    public static void main(String[] args)    {        int arr[] = { 1, 2, 4, 3, 4 };        int n = arr.length;         System.out.println(findMinDifference(arr, n));    }}

Python3

 # Python 3 implementation of the approach # Function to return the minimum# required differencedef findMinDifference(arr, n):         if(arr < arr):        min__ = secondMax = arr    else:        min__ = secondMax = arr             if(arr < arr):        max__ = secondMin = arr    else:        max__ = secondMin = arr     for i in range(2, n):                 # If current element is greater        # than max        if (arr[i] > max__):                         # max will become secondMax            secondMax = max__             # Update the max            max__ = arr[i]         # If current element is greater than        # secondMax but smaller than max        elif (arr[i] > secondMax):                         # Update the secondMax            secondMax = arr[i]         # If current element is smaller than min        elif(arr[i] < min__):                         # min will become secondMin            secondMin = min__             # Update the min            min__ = arr[i]         # If current element is smaller than        # secondMin but greater than min        elif(arr[i] < secondMin):                         # Update the secondMin            secondMin = arr[i]         # Minimum of the two possible    # differences    diff = min(max__ - secondMin,                       secondMax - min__)    return diff # Driver codeif __name__ == '__main__':    arr = [1, 2, 4, 3, 4]    n = len(arr)    print(findMinDifference(arr, n)) # This code is contributed by# Surendra_Gangwar

C#

 using System;                     // C# implementation of the approachpublic class GFG {     // Function to return the minimum required difference    static int findMinDifference(int []arr, int n)    {        int min, secondMin, max, secondMax;         min = secondMax = (arr < arr) ? arr : arr;        max = secondMin = (arr < arr) ? arr : arr;         for (int i = 2; i < n; i++) {             // If current element is greater than max            if (arr[i] > max) {                 // max will become secondMax                secondMax = max;                 // Update the max                max = arr[i];            }             // If current element is greater than secondMax            // but smaller than max            else if (arr[i] > secondMax) {                 // Update the secondMax                secondMax = arr[i];            }             // If current element is smaller than min            else if (arr[i] < min) {                 // min will become secondMin                secondMin = min;                 // Update the min                min = arr[i];            }             // If current element is smaller than secondMin            // but greater than min            else if (arr[i] < secondMin) {                 // Update the secondMin                secondMin = arr[i];            }        }         // Minimum of the two possible differences        int diff = Math.Min(max - secondMin, secondMax - min);         return diff;    }     // Driver code    public static void Main()    {        int []arr = { 1, 2, 4, 3, 4 };        int n = arr.Length;         Console.WriteLine(findMinDifference(arr, n));    }}// This code is contributed by 29AjayKumar

PHP

 \$max__)        {            // max will become secondMax            \$secondMax = \$max__;             // Update the max            \$max__ = \$arr[\$i];        }         // If current element is greater than secondMax        // but smaller than max        else if (\$arr[\$i] > \$secondMax)        {             // Update the secondMax            \$secondMax = \$arr[\$i];        }         // If current element is smaller than min        else if (\$arr[\$i] < \$min__)        {             // min will become secondMin            \$secondMin = \$min__;             // Update the min            \$min__ = \$arr[\$i];        }         // If current element is smaller than secondMin        // but greater than min        else if (\$arr[\$i] < \$secondMin)        {                             // Update the secondMin            \$secondMin = \$arr[\$i];        }    }     // Minimum of the two possible differences    \$diff = min(\$max__ - \$secondMin,                         \$secondMax - \$min__);    return \$diff;} // Driver code\$arr = array( 1, 2, 4, 3, 4 );\$n = count(\$arr);print(findMinDifference(\$arr, \$n)); // This code is contributed by mits?>

Javascript


Output:
2

My Personal Notes arrow_drop_up