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: 1
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: 2
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[1].
- Remove the maximum, and diff2 = arr[n – 2] – arr[0].
- Print min(diff1, diff2) in the end.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int findMinDifference( int arr[], int n)
{
sort(arr, arr + n);
int diff1 = arr[n - 1] - arr[1];
int diff2 = arr[n - 2] - arr[0];
return min(diff1, diff2);
}
int main()
{
int arr[] = { 1, 2, 4, 3, 4 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << findMinDifference(arr, n);
return 0;
}
|
Java
import java.util.*;
class solution
{
static int findMinDifference( int arr[], int n)
{
Arrays.sort(arr);
int diff1 = arr[n - 1 ] - arr[ 1 ];
int diff2 = arr[n - 2 ] - arr[ 0 ];
return Math.min(diff1, diff2);
}
public static void main(String args[])
{
int arr[] = { 1 , 2 , 4 , 3 , 4 };
int n = arr.length;
System.out.print(findMinDifference(arr, n));
}
}
|
Python3
def findMinDifference(arr, n) :
arr.sort()
diff1 = arr[n - 1 ] - arr[ 1 ]
diff2 = arr[n - 2 ] - arr[ 0 ]
return min (diff1, diff2)
if __name__ = = "__main__" :
arr = [ 1 , 2 , 4 , 3 , 4 ]
n = len (arr)
print (findMinDifference(arr, n))
|
C#
using System;
public class GFG{
static int findMinDifference( int []arr, int n)
{
Array.Sort(arr);
int diff1 = arr[n - 1] - arr[1];
int diff2 = arr[n - 2] - arr[0];
return Math.Min(diff1, diff2);
}
static public void Main (){
int []arr = { 1, 2, 4, 3, 4 };
int n = arr.Length;
Console.Write(findMinDifference(arr, n));
}
}
|
PHP
<?php
function findMinDifference( $arr , $n )
{
sort( $arr , 0);
$diff1 = $arr [ $n - 1] - $arr [1];
$diff2 = $arr [ $n - 2] - $arr [0];
return min( $diff1 , $diff2 );
}
$arr = array (1, 2, 4, 3, 4);
$n = sizeof( $arr );
echo findMinDifference( $arr , $n );
|
Javascript
<script>
function findMinDifference(arr, n)
{
arr.sort();
let diff1 = arr[n - 1] - arr[1];
let diff2 = arr[n - 2] - arr[0];
return Math.min(diff1, diff2);
}
let arr = [ 1, 2, 4, 3, 4 ];
let n = arr.length;
document.write(findMinDifference(arr, n));
</script>
|
Complexity Analysis:
- Time Complexity: O(nlogn)
- Auxiliary Space : O(1)
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++
#include<bits/stdc++.h>
using namespace std;
int findMinDifference( int arr[], int n)
{
int min__, secondMin, max__, secondMax;
min__ = secondMax = (arr[0] < arr[1]) ? arr[0] : arr[1];
max__ = secondMin = (arr[0] < arr[1]) ? arr[1] : arr[0];
for ( int i = 2; i < n; i++)
{
if (arr[i] > max__)
{
secondMax = max__;
max__ = arr[i];
}
else if (arr[i] > secondMax)
{
secondMax = arr[i];
}
else if (arr[i] < min__)
{
secondMin = min__;
min__ = arr[i];
}
else if (arr[i] < secondMin) {
secondMin = arr[i];
}
}
int diff = min(max__ - secondMin, secondMax - min__);
return diff;
}
int main()
{
int arr[] = { 1, 2, 4, 3, 4 };
int n = sizeof (arr)/ sizeof (arr[0]);
cout << (findMinDifference(arr, n));
}
|
Java
public class GFG {
static int findMinDifference( int arr[], int n)
{
int min, secondMin, max, secondMax;
min = secondMax = (arr[ 0 ] < arr[ 1 ]) ? arr[ 0 ] : arr[ 1 ];
max = secondMin = (arr[ 0 ] < arr[ 1 ]) ? arr[ 1 ] : arr[ 0 ];
for ( int i = 2 ; i < n; i++) {
if (arr[i] > max) {
secondMax = max;
max = arr[i];
}
else if (arr[i] > secondMax) {
secondMax = arr[i];
}
else if (arr[i] < min) {
secondMin = min;
min = arr[i];
}
else if (arr[i] < secondMin) {
secondMin = arr[i];
}
}
int diff = Math.min(max - secondMin, secondMax - min);
return diff;
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 4 , 3 , 4 };
int n = arr.length;
System.out.println(findMinDifference(arr, n));
}
}
|
Python3
def findMinDifference(arr, n):
if (arr[ 0 ] < arr[ 1 ]):
min__ = secondMax = arr[ 0 ]
else :
min__ = secondMax = arr[ 1 ]
if (arr[ 0 ] < arr[ 1 ]):
max__ = secondMin = arr[ 1 ]
else :
max__ = secondMin = arr[ 0 ]
for i in range ( 2 , n):
if (arr[i] > max__):
secondMax = max__
max__ = arr[i]
elif (arr[i] > secondMax):
secondMax = arr[i]
elif (arr[i] < min__):
secondMin = min__
min__ = arr[i]
elif (arr[i] < secondMin):
secondMin = arr[i]
diff = min (max__ - secondMin,
secondMax - min__)
return diff
if __name__ = = '__main__' :
arr = [ 1 , 2 , 4 , 3 , 4 ]
n = len (arr)
print (findMinDifference(arr, n))
|
C#
using System;
public class GFG {
static int findMinDifference( int []arr, int n)
{
int min, secondMin, max, secondMax;
min = secondMax = (arr[0] < arr[1]) ? arr[0] : arr[1];
max = secondMin = (arr[0] < arr[1]) ? arr[1] : arr[0];
for ( int i = 2; i < n; i++) {
if (arr[i] > max) {
secondMax = max;
max = arr[i];
}
else if (arr[i] > secondMax) {
secondMax = arr[i];
}
else if (arr[i] < min) {
secondMin = min;
min = arr[i];
}
else if (arr[i] < secondMin) {
secondMin = arr[i];
}
}
int diff = Math.Min(max - secondMin, secondMax - min);
return diff;
}
public static void Main()
{
int []arr = { 1, 2, 4, 3, 4 };
int n = arr.Length;
Console.WriteLine(findMinDifference(arr, n));
}
}
|
PHP
<?php
function findMinDifference( $arr , $n )
{
$min__ = $secondMax = ( $arr [0] < $arr [1]) ?
$arr [0] : $arr [1];
$max__ = $secondMin = ( $arr [0] < $arr [1]) ?
$arr [1] : $arr [0];
for ( $i = 2; $i < $n ; $i ++)
{
if ( $arr [ $i ] > $max__ )
{
$secondMax = $max__ ;
$max__ = $arr [ $i ];
}
else if ( $arr [ $i ] > $secondMax )
{
$secondMax = $arr [ $i ];
}
else if ( $arr [ $i ] < $min__ )
{
$secondMin = $min__ ;
$min__ = $arr [ $i ];
}
else if ( $arr [ $i ] < $secondMin )
{
$secondMin = $arr [ $i ];
}
}
$diff = min( $max__ - $secondMin ,
$secondMax - $min__ );
return $diff ;
}
$arr = array ( 1, 2, 4, 3, 4 );
$n = count ( $arr );
print (findMinDifference( $arr , $n ));
?>
|
Javascript
<script>
function findMinDifference(arr, n)
{
let min__, secondMin, max__, secondMax;
min__ = secondMax = (arr[0] < arr[1]) ? arr[0] : arr[1];
max__ = secondMin = (arr[0] < arr[1]) ? arr[1] : arr[0];
for (let i = 2; i < n; i++)
{
if (arr[i] > max__)
{
secondMax = max__;
max__ = arr[i];
}
else if (arr[i] > secondMax)
{
secondMax = arr[i];
}
else if (arr[i] < min__)
{
secondMin = min__;
min__ = arr[i];
}
else if (arr[i] < secondMin) {
secondMin = arr[i];
}
}
let diff = Math.min(max__ - secondMin, secondMax - min__);
return diff;
}
let arr = [ 1, 2, 4, 3, 4 ];
let n = arr.length;
document.write(findMinDifference(arr, n));
</script>
|
Complexity Analysis:
- Time Complexity: O(n), to traverse an array of size n
- Auxiliary Space: O(1), as no extra space is used