Given an array of n integers and a positive number k. We are allowed to take any k integers from the given array. The task is to find the minimum possible value of the difference between maximum and minimum of K numbers.
Examples:
Input : arr[] = {10, 100, 300, 200, 1000, 20, 30}
k = 3
Output : 20
20 is the minimum possible difference between any
maximum and minimum of any k numbers.
Given k = 3, we get the result 20 by selecting
integers {10, 20, 30}.
max(10, 20, 30) - min(10, 20, 30) = 30 - 10 = 20.
Input : arr[] = {1, 2, 3, 4, 10, 20, 30, 40,
100, 200}.
k = 4
Output : 3
The idea is to sort the array and choose k continuous integers. Why continuous? Let the chosen k integers be arr[0], arr[1], …arr[r], arr[r+x]…, arr[k-1], all in increasing order but not continuous in the sorted array. This means there exists an integer p which lies between arr[r] and arr[r+x],. So if p is included and arr[0] is removed, then the new difference will be arr[r] – arr[1] whereas old difference was arr[r] – arr[0]. And we know arr[0] ? arr[1] ? … ? arr[k-1] so minimum difference reduces or remains the same. If we perform the same procedure for other p like numbers, we get the minimum difference.
Algorithm to solve the problem:
- Sort the Array.
- Calculate the maximum(k numbers) – minimum(k numbers) for each group of k consecutive integers.
- Return minimum of all values obtained in step 2.
Below is the implementation of above idea :
C++
#include<bits/stdc++.h>
using namespace std;
int minDiff( int arr[], int n, int k)
{
int result = INT_MAX;
sort(arr, arr + n);
for ( int i=0; i<=n-k; i++)
result = min(result, arr[i+k-1] - arr[i]);
return result;
}
int main()
{
int arr[] = {10, 100, 300, 200, 1000, 20, 30};
int n = sizeof (arr)/ sizeof (arr[0]);
int k = 3;
cout << minDiff(arr, n, k) << endl;
return 0;
}
|
Java
import java.util.*;
class GFG {
static int minDiff( int arr[], int n, int k) {
int result = Integer.MAX_VALUE;
Arrays.sort(arr);
for ( int i = 0 ; i <= n - k; i++)
result = Math.min(result, arr[i + k - 1 ] - arr[i]);
return result;
}
public static void main(String[] args) {
int arr[] = { 10 , 100 , 300 , 200 , 1000 , 20 , 30 };
int n = arr.length;
int k = 3 ;
System.out.println(minDiff(arr, n, k));
}
}
|
Python3
def minDiff(arr,n,k):
result = + 2147483647
arr.sort()
for i in range (n - k + 1 ):
result = int ( min (result, arr[i + k - 1 ] - arr[i]))
return result
arr = [ 10 , 100 , 300 , 200 , 1000 , 20 , 30 ]
n = len (arr)
k = 3
print (minDiff(arr, n, k))
|
C#
using System;
class GFG {
static int minDiff( int []arr, int n,
int k)
{
int result = int .MaxValue;
Array.Sort(arr);
for ( int i = 0; i <= n - k; i++)
result = Math.Min(result, arr[i + k - 1] - arr[i]);
return result;
}
public static void Main() {
int []arr = {10, 100, 300, 200, 1000, 20, 30};
int n = arr.Length;
int k = 3;
Console.WriteLine(minDiff(arr, n, k));
}
}
|
PHP
<?php
function minDiff( $arr , $n , $k )
{
$INT_MAX = 2147483647;
$result = $INT_MAX ;
sort( $arr , $n );
sort( $arr );
for ( $i = 0; $i <= $n - $k ; $i ++)
$result = min( $result , $arr [ $i + $k - 1] -
$arr [ $i ]);
return $result ;
}
$arr = array (10, 100, 300, 200, 1000, 20, 30);
$n = sizeof( $arr );
$k = 3;
echo minDiff( $arr , $n , $k );
?>
|
Javascript
<script>
function minDiff(arr , n , k) {
var result = Number.MAX_VALUE;
arr.sort((a,b)=>a-b);
for (i = 0; i <= n - k; i++)
result = Math.min(result, arr[i + k - 1] - arr[i]);
return result;
}
var arr = [ 10, 100, 300, 200, 1000, 20, 30 ];
var n = arr.length;
var k = 3;
document.write(minDiff(arr, n, k));
</script>
|
Time Complexity: O(nlogn).
Auxiliary Space: O(1)
If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!