Open In App
Related Articles

Choose k array elements such that difference of maximum and minimum is minimized

Improve Article
Improve
Save Article
Save
Like Article
Like

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
Recommended Practice

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: 

  1. Sort the Array.
  2. Calculate the maximum(k numbers) – minimum(k numbers) for each group of k consecutive integers.
  3. Return minimum of all values obtained in step 2.

Below is the implementation of above idea : 

C++




// C++ program to find minimum difference of maximum
// and minimum of K number.
#include<bits/stdc++.h>
using namespace std;
  
// Return minimum difference of maximum and minimum
// of k elements of arr[0..n-1].
int minDiff(int arr[], int n, int k)
{
    int result = INT_MAX;
  
    // Sorting the array.
    sort(arr, arr + n);
  
    // Find minimum value among all K size subarray.
    for (int i=0; i<=n-k; i++)
        result = min(result, arr[i+k-1] - arr[i]);
  
    return result;
}
  
// Driven Program
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




// Java program to find minimum difference 
// of maximum and minimum of K number.
import java.util.*;
  
class GFG {
      
// Return minimum difference of 
// maximum and minimum of k 
// elements of arr[0..n-1].
static int minDiff(int arr[], int n, int k) {
    int result = Integer.MAX_VALUE;
  
    // Sorting the array.
    Arrays.sort(arr);
  
    // Find minimum value among 
    // all K size subarray.
    for (int i = 0; i <= n - k; i++)
    result = Math.min(result, arr[i + k - 1] - arr[i]);
  
    return result;
}
  
// Driver code
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));
}
}
  
// This code is contributed by Anant Agarwal.


Python3




# Python program to find minimum
# difference of maximum
# and minimum of K number.
  
# Return minimum difference
# of maximum and minimum
# of k elements of arr[0..n-1].
def minDiff(arr,n,k):
    result = +2147483647
   
    # Sorting the array.
    arr.sort()
   
    # Find minimum value among
    # all K size subarray.
    for i in range(n-k+1):
        result = int(min(result, arr[i+k-1] - arr[i]))
   
    return result
  
# Driver code
  
arr= [10, 100, 300, 200, 1000, 20, 30]
n =len(arr)
k = 3
   
print(minDiff(arr, n, k))
  
# This code is contributed
# by Anant Agarwal.


C#




// C# program to find minimum
// difference of maximum and 
// minimum of K number.
using System;
  
class GFG {
      
// Return minimum difference of 
// maximum and minimum of k 
// elements of arr[0..n - 1].
static int minDiff(int []arr, int n,
                   int k) 
{
    int result = int.MaxValue;
  
    // Sorting the array.
    Array.Sort(arr);
  
    // Find minimum value among 
    // all K size subarray.
    for (int i = 0; i <= n - k; i++)
    result = Math.Min(result, arr[i + k - 1] - arr[i]);
  
    return result;
}
  
// Driver code
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));
}
}
  
// This code is contributed by vt_m.


PHP




<?php
// PHP program to find minimum
// difference of maximum and 
// minimum of K number.
  
// Return minimum difference 
// of maximum and minimum
// of k elements of arr[0..n-1].
function minDiff($arr, $n, $k)
{
    $INT_MAX = 2147483647;
    $result = $INT_MAX ;
  
    // Sorting the array.
    sort($arr , $n);
    sort($arr); 
  
    // Find minimum value among
    // all K size subarray.
    for ($i = 0; $i <= $n - $k; $i++)
        $result = min($result, $arr[$i + $k - 1] - 
                                       $arr[$i]);
    return $result;
}
  
    // Driver Code
    $arr = array(10, 100, 300, 200, 1000, 20, 30);
    $n = sizeof($arr);
    $k = 3;
    echo minDiff($arr, $n, $k);
      
// This code is contributed by nitin mittal.
?>


Javascript




<script>
// javascript program to find minimum difference 
// of maximum and minimum of K number.
  
    // Return minimum difference of
    // maximum and minimum of k
    // elements of arr[0..n-1].
    function minDiff(arr , n , k) {
        var result = Number.MAX_VALUE;
  
        // Sorting the array.
        arr.sort((a,b)=>a-b);
  
        // Find minimum value among
        // all K size subarray.
        for (i = 0; i <= n - k; i++)
            result = Math.min(result, arr[i + k - 1] - arr[i]);
  
        return result;
    }
  
    // Driver code
      
        var arr = [ 10, 100, 300, 200, 1000, 20, 30 ];
        var n = arr.length;
        var k = 3;
  
        document.write(minDiff(arr, n, k));
  
// This code contributed by gauravrajput1 
</script>


Output

20

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!

Last Updated : 11 Sep, 2023
Like Article
Save Article
Similar Reads
Related Tutorials