Related Articles

# Place k elements such that minimum distance is maximized

• Difficulty Level : Medium
• Last Updated : 08 Oct, 2021

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 (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++

 `// C++ program to find largest minimum distance``// among k points.``#include ` `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 position``    ``int` `pos = arr;` `    ``// 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``    ``// because, minimum distance between each element``    ``// can be one and not arr. consider this example:``    ``// arr[] = {9,12} and you have to place 2 element``    ``// then left = arr will force the function to``    ``// look the answer between range arr 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 iff``            ``// 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``int` `main()``{``    ``int` `arr[] = { 1, 2, 8, 4, 9 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr);``    ``int` `k = 3;``    ``cout << largestMinDist(arr, n, k);``    ``return` `0;``}`

## Java

 `// 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 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``        ``// because, minimum distance between each element``        ``// can be one and not arr. consider this example:``        ``// arr[] = {9,12} and you have to place 2 element``        ``// then left = arr will force the function to``        ``// look the answer between range arr 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.`

## Python3

 `# 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 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``    ``# because, minimum distance between each element``    ``# can be one and not arr. consider this example:``    ``# arr[] = {9,12} and you have to place 2 element``    ``# then left = arr will force the function to``    ``# look the answer between range arr 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 iff``            ``# 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``if` `__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#

 `// 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``        ``// position``        ``int` `pos = arr;` `        ``// 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``        ``// because, minimum distance between each element``        ``// can be one and not arr. consider this example:``        ``// arr[] = {9,12} and you have to place 2 element``        ``// then left = arr will force the function to``        ``// look the answer between range arr 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

 `= ``\$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``    ``// because, minimum distance between each element``    ``// can be one and not arr. consider this example:``    ``// arr[] = {9,12} and you have to place 2 element``    ``// then left = arr will force the function to``    ``// look the answer between range arr 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 iff 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``?>`

## Javascript

 ``
Output

`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.