Place k elements such that minimum distance is maximized

20 Apr, 2022
Given an array representing n positions along a straight line. Find k (where k <= n) elements from the array such that the minimum distance between any two (consecutive points among the k points) is maximized.
Examples :  
Input : arr[] = {1, 2, 8, 4, 9}
            k = 3
Output : 3
Largest minimum distance = 3
3 elements arranged at positions 1, 4 and 8, 
Resulting in a minimum distance of 3

Input  : arr[] = {1, 2, 7, 5, 11, 12}
             k = 3
Output : 5
Largest minimum distance = 5
3 elements arranged at positions 1, 7 and 12, 
resulting in a minimum distance of 5 (between
7 and 12)
A Naive Solution is to consider all subsets of size 3 and find the minimum distance for every subset. Finally, return the largest of all minimum distances.
An Efficient Solution is based on Binary Search. We first sort the array. Now we know maximum possible value result is arr[n-1] – arr[0] (for k = 2). We do a binary search for maximum result for given k. We start with the middle of the maximum possible result. If the middle is a feasible solution, we search on the right half of mid. Else we search is left half. To check feasibility, we place k elements under given mid-distance.
C++
Java
Python3
C#
PHP
Javascript
// C++ program to find largest minimum distance// among k points.#include <bits/stdc++.h> using namespace std; // Returns true if it is possible to arrange// k elements of arr[0..n-1] with minimum distance// given as mid.bool isFeasible(int mid, int arr[], int n, int k){    // Place first element at arr[0] position    int pos = arr[0];     // Initialize count of elements placed.    int elements = 1;     // Try placing k elements with minimum    // distance mid.    for (int i = 1; i < n; i++) {        if (arr[i] - pos >= mid) {            // Place next element if its            // distance from the previously            // placed element is greater            // than current mid            pos = arr[i];            elements++;             // Return if all elements are placed            // successfully            if (elements == k)                return true;        }    }    return 0;} // Returns largest minimum distance for k elements// in arr[0..n-1]. If elements can't be placed,// returns -1.int largestMinDist(int arr[], int n, int k){    // Sort the positions    sort(arr, arr + n);     // Initialize result.    int res = -1;     // Consider the maximum possible distance    //here we are using right value as highest distance difference,      //so we remove some extra checks    int left = 1, right = arr[n - 1];     // left is initialized with 1 and not with arr[0]    // because, minimum distance between each element    // can be one and not arr[0]. consider this example:    // arr[] = {9,12} and you have to place 2 element    // then left = arr[0] will force the function to    // look the answer between range arr[0] to arr[n-1],    // i.e 9 to 12, but the answer is 3 so It is required    // that you initialize the left with 1     // Do binary search for largest minimum distance    while (left < right) {        int mid = (left + right) / 2;         // If it is possible to place k elements        // with minimum distance mid, search for        // higher distance.        if (isFeasible(mid, arr, n, k)) {            // Change value of variable max to mid if            // all elements can be successfully placed            res = max(res, mid);            left = mid + 1;        }         // If not possible to place k elements, search        // for lower distance        else            right = mid;    }     return res;} // Driver codeint main(){    int arr[] = { 1, 2, 8, 4, 9 };    int n = sizeof(arr) / sizeof(arr[0]);    int k = 3;    cout << largestMinDist(arr, n, k);    return 0;}
// Java program to find largest// minimum distance among k points.import java.util.Arrays; class GFG {    // Returns true if it is possible to    // arrange k elements of arr[0..n-1]    // with minimum distance given as mid.    static boolean isFeasible(int mid, int arr[], int n,                              int k)    {        // Place first element at arr[0] position        int pos = arr[0];         // Initialize count of elements placed.        int elements = 1;         // Try placing k elements with minimum        // distance mid.        for (int i = 1; i < n; i++) {            if (arr[i] - pos >= mid) {                // Place next element if its                // distance from the previously                // placed element is greater                // than current mid                pos = arr[i];                elements++;                 // Return if all elements are                // placed successfully                if (elements == k)                    return true;            }        }        return false;    }     // Returns largest minimum distance for    // k elements in arr[0..n-1]. If elements    // can't be placed, returns -1.    static int largestMinDist(int arr[], int n, int k)    {        // Sort the positions        Arrays.sort(arr);         // Initialize result.        int res = -1;         // Consider the maximum possible distance        int left = 1, right = arr[n - 1];         // left is initialized with 1 and not with arr[0]        // because, minimum distance between each element        // can be one and not arr[0]. consider this example:        // arr[] = {9,12} and you have to place 2 element        // then left = arr[0] will force the function to        // look the answer between range arr[0] to arr[n-1],        // i.e 9 to 12, but the answer is 3 so It is        // required that you initialize the left with 1         // Do binary search for largest        // minimum distance        while (left < right) {            int mid = (left + right) / 2;             // If it is possible to place k            // elements with minimum distance mid,            // search for higher distance.            if (isFeasible(mid, arr, n, k)) {                // Change value of variable max to                // mid if all elements can be                // successfully placed                res = Math.max(res, mid);                left = mid + 1;            }             // If not possible to place k elements,            // search for lower distance            else                right = mid;        }         return res;    }     // driver code    public static void main(String[] args)    {        int arr[] = { 1, 2, 8, 4, 9 };        int n = arr.length;        int k = 3;        System.out.print(largestMinDist(arr, n, k));    }} // This code is contributed by Anant Agarwal.
# Python 3 program to find largest minimum# distance among k points. # Returns true if it is possible to arrange# k elements of arr[0..n-1] with minimum# distance given as mid.  def isFeasible(mid, arr, n, k):     # Place first element at arr[0] position    pos = arr[0]     # Initialize count of elements placed.    elements = 1     # Try placing k elements with minimum    # distance mid.    for i in range(1, n, 1):        if (arr[i] - pos >= mid):             # Place next element if its distance            # from the previously placed element            # is greater than current mid            pos = arr[i]            elements += 1             # Return if all elements are placed            # successfully            if (elements == k):                return True    return 0 # Returns largest minimum distance for k elements# in arr[0..n-1]. If elements can't be placed,# returns -1.  def largestMinDist(arr, n, k):     # Sort the positions    arr.sort(reverse=False)     # Initialize result.    res = -1     # Consider the maximum possible distance    left = 1    right = arr[n - 1]     # left is initialized with 1 and not with arr[0]    # because, minimum distance between each element    # can be one and not arr[0]. consider this example:    # arr[] = {9,12} and you have to place 2 element    # then left = arr[0] will force the function to    # look the answer between range arr[0] to arr[n-1],    # i.e 9 to 12, but the answer is 3 so It is required    # that you initialize the left with 1     # Do binary search for largest    # minimum distance    while (left < right):        mid = (left + right) / 2         # If it is possible to place k elements        # with minimum distance mid, search for        # higher distance.        if (isFeasible(mid, arr, n, k)):             # Change value of variable max to mid if            # all elements can be successfully placed            res = max(res, mid)            left = mid + 1         # If not possible to place k elements,        # search for lower distance        else:            right = mid     return res  # Driver codeif __name__ == '__main__':    arr = [1, 2, 8, 4, 9]    n = len(arr)    k = 3    print(largestMinDist(arr, n, k)) # This code is contributed by# Sanjit_prasad
// C# program to find largest// minimum distance among k points.using System; public class GFG {     // Returns true if it is possible to    // arrange k elements of arr[0..n-1]    // with minimum distance given as mid.    static bool isFeasible(int mid, int[] arr, int n, int k)    {         // Place first element at arr[0]        // position        int pos = arr[0];         // Initialize count of elements placed.        int elements = 1;         // Try placing k elements with minimum        // distance mid.        for (int i = 1; i < n; i++) {            if (arr[i] - pos >= mid) {                 // Place next element if its                // distance from the previously                // placed element is greater                // than current mid                pos = arr[i];                elements++;                 // Return if all elements are                // placed successfully                if (elements == k)                    return true;            }        }         return false;    }     // Returns largest minimum distance for    // k elements in arr[0..n-1]. If elements    // can't be placed, returns -1.    static int largestMinDist(int[] arr, int n, int k)    {         // Sort the positions        Array.Sort(arr);         // Initialize result.        int res = -1;         // Consider the maximum possible        // distance        int left = 1, right = arr[n - 1];         // left is initialized with 1 and not with arr[0]        // because, minimum distance between each element        // can be one and not arr[0]. consider this example:        // arr[] = {9,12} and you have to place 2 element        // then left = arr[0] will force the function to        // look the answer between range arr[0] to arr[n-1],        // i.e 9 to 12, but the answer is 3 so It is        // required that you initialize the left with 1         // Do binary search for largest        // minimum distance        while (left < right) {            int mid = (left + right) / 2;             // If it is possible to place k            // elements with minimum distance            // mid, search for higher distance.            if (isFeasible(mid, arr, n, k)) {                // Change value of variable                // max to mid if all elements                // can be successfully placed                res = Math.Max(res, mid);                left = mid + 1;            }             // If not possible to place k            // elements, search for lower            // distance            else                right = mid;        }         return res;    }     // driver code    public static void Main()    {        int[] arr = { 1, 2, 8, 4, 9 };        int n = arr.Length;        int k = 3;         Console.WriteLine(largestMinDist(arr, n, k));    }} // This code is contributed by Sam007.
<?php// PHP program to find largest// minimum distance among k points. // Returns true if it is possible// to arrange k elements of// arr[0..n-1] with minimum// distance given as mid.function isFeasible($mid, $arr,                    $n, $k){    // Place first element    // at arr[0] position    $pos = $arr[0];     // Initialize count of    // elements placed.    $elements = 1;     // Try placing k elements    // with minimum distance mid.    for ($i = 1; $i < $n; $i++)    {        if ($arr[$i] - $pos >= $mid)        {            // Place next element if            // its distance from the            // previously placed            // element is greater            // than current mid            $pos = $arr[$i];            $elements++;             // Return if all elements            // are placed successfully            if ($elements == $k)            return true;        }    }    return 0;} // Returns largest minimum// distance for k elements// in arr[0..n-1]. If elements// can't be placed, returns -1.function largestMinDist($arr, $n, $k){    // Sort the positions    sort($arr);     // Initialize result.    $res = -1;     // Consider the maximum    // possible distance    $left = 1;    $right = $arr[$n - 1];       // left is initialized with 1 and not with arr[0]    // because, minimum distance between each element    // can be one and not arr[0]. consider this example:    // arr[] = {9,12} and you have to place 2 element    // then left = arr[0] will force the function to    // look the answer between range arr[0] to arr[n-1],    // i.e 9 to 12, but the answer is 3 so It is required    // that you initialize the left with 1     // Do binary search for    // largest minimum distance    while ($left < $right)    {        $mid = ($left + $right) / 2;         // If it is possible to place        // k elements with minimum        // distance mid, search for        // higher distance.        if (isFeasible($mid, $arr,                       $n, $k))        {            // Change value of variable            // max to mid if all elements            // can be successfully placed            $res = max($res, $mid);            $left = $mid + 1;        }         // If not possible to place        // k elements, search for        // lower distance        else            $right = $mid;    }     return $res;} // Driver Code$arr = array(1, 2, 8, 4, 9);$n = sizeof($arr);$k = 3;echo largestMinDist($arr, $n, $k); // This code is contributed by aj_36?>
<script>     // Javascript program to find largest    // minimum distance among k points.         // Returns true if it is possible to    // arrange k elements of arr[0..n-1]    // with minimum distance given as mid.    function isFeasible(mid, arr, n, k)    {          // Place first element at arr[0]        // position        let pos = arr[0];          // Initialize count of elements placed.        let elements = 1;          // Try placing k elements with minimum        // distance mid.        for (let i = 1; i < n; i++) {            if (arr[i] - pos >= mid) {                  // Place next element if its                // distance from the previously                // placed element is greater                // than current mid                pos = arr[i];                elements++;                  // Return if all elements are                // placed successfully                if (elements == k)                    return true;            }        }          return false;    }      // Returns largest minimum distance for    // k elements in arr[0..n-1]. If elements    // can't be placed, returns -1.    function largestMinDist(arr, n, k)    {          // Sort the positions        arr.sort(function(a, b){return a - b});          // Initialize result.        let res = -1;          // Consider the maximum possible        // distance        let left = 1, right = arr[n - 1];          // left is initialized with 1 and not with arr[0]        // because, minimum distance between each element        // can be one and not arr[0]. consider this example:        // arr[] = {9,12} and you have to place 2 element        // then left = arr[0] will force the function to        // look the answer between range arr[0] to arr[n-1],        // i.e 9 to 12, but the answer is 3 so It is        // required that you initialize the left with 1          // Do binary search for largest        // minimum distance        while (left < right) {            let mid = parseInt((left + right) / 2, 10);              // If it is possible to place k            // elements with minimum distance            // mid, search for higher distance.            if (isFeasible(mid, arr, n, k)) {                // Change value of variable                // max to mid if all elements                // can be successfully placed                res = Math.max(res, mid);                left = mid + 1;            }              // If not possible to place k            // elements, search for lower            // distance            else                right = mid;        }          return res;    }         let arr = [ 1, 2, 8, 4, 9 ];    let n = arr.length;    let k = 3;     document.write(largestMinDist(arr, n, k));         </script>
3
Time Complexity : O(nlog n) , where n is length of array.
Space Compeity : O(1)
This article is contributed by Raghav Jajodia. 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.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Sam007
jit_t
sonamchawla
Sanjit_Prasad
naklicoder
AakashYadav4
achy97
mukesh07
gulshankumarar231
ayush123ngp
bhiruddigvijay
iramkhalid24
simmytarika5
Binary Search
Arrays
Divide and Conquer
Arrays
Divide and Conquer
Binary Search
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Multidimensional Arrays in Java
Stack Data Structure (Introduction and Program)
Linear Search
Merge Sort
QuickSort
Binary Search
Maximum and minimum of an array using minimum number of comparisons
Count Inversions in an array | Set 1 (Using Merge Sort)