Find the minimum of maximum length of a jump required to reach the last island in exactly k jumps

Given an array arr[] of integers, where the ith integer represents the position where an island is present, and an integer k (1 ≤ k < N). A person is standing on the 0th island and has to reach the last island, by jumping from one island to another in exactly k jumps, the task is to find the minimum of the maximum length of a jump a person will make in his journey. Note that the position of all the islands are given in ascending order.

Examples:

Input: arr[] = {2, 15, 36, 43}, k = 1
Output: 41
There is only way to reach the end
2 -> 43
Input: arr[] = {2, 15, 36, 43}, k = 2
Output: 28
There are two ways to reach the last island
2 -> 15 -> 43
Here maximum distance between any two consecutive islands is between 43 and 15 that is 28.
2 -> 36 -> 43
Here maximum distance between any two consecutive islands is between 36 and 2 that is 34.
Thus minimum of 28 and 34 is 28.

Approach: The idea is to use binary search, and for a distance mid, compute whether it is possible to reach the end of the array in exactly k jumps where the maximum distance between any two islands chosen for jumping is less than or equal to the distance mid, then check if some distance less than mid exists for which it is possible to reach the end in exactly k jumps.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function that returns true if it is possible
// to reach end of the array in exactly k jumps
bool isPossible(int arr[], int n, int dist, int k)
{
  
    // Variable to store the number of
    // steps required to reach the end
    int req = 0;
  
    int curr = 0;
    int prev = 0;
  
    for (int i = 0; i < n; i++) {
        while (curr != n && arr[curr] - arr[prev] <= dist)
            curr++;
        req++;
  
        if (curr == n)
            break;
        prev = curr - 1;
    }
  
    if (curr != n)
        return false;
  
    // If it is possible to reach the
    // end in exactly k jumps
    if (req <= k)
        return true;
  
    return false;
}
  
// Returns the minimum maximum distance required
// to reach the end of the array in exactly k jumps
int minDistance(int arr[], int n, int k)
{
    int l = 0;
    int h = arr[n - 1];
  
    // Stores the answer
    int ans = 0;
  
    // Binary search to calculate the result
    while (l <= h) {
        int m = (l + h) / 2;
        if (isPossible(arr, n, m, k)) {
            ans = m;
            h = m - 1;
        }
        else
            l = m + 1;
    }
  
    return ans;
}
  
// Driver code
int main()
{
    int arr[] = { 2, 15, 36, 43 };
    int n = sizeof(arr) / sizeof(int);
    int k = 2;
  
    cout << minDistance(arr, n, k);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
  
class GFG
{
  
    // Function that returns true if it is possible
    // to reach end of the array in exactly k jumps
    static boolean isPossible(int arr[], int n, int dist, int k)
    {
  
        // Variable to store the number of
        // steps required to reach the end
        int req = 0;
  
        int curr = 0;
        int prev = 0;
  
        for (int i = 0; i < n; i++)
        {
            while (curr != n && arr[curr] - arr[prev] <= dist)
            {
                curr++;
            }
            req++;
  
            if (curr == n)
            {
                break;
            }
            prev = curr - 1;
        }
  
        if (curr != n)
        {
            return false;
        }
  
        // If it is possible to reach the
        // end in exactly k jumps
        if (req <= k)
        {
            return true;
        }
  
        return false;
    }
  
    // Returns the minimum maximum distance required
    // to reach the end of the array in exactly k jumps
    static int minDistance(int arr[], int n, int k)
    {
        int l = 0;
        int h = arr[n - 1];
  
        // Stores the answer
        int ans = 0;
  
        // Binary search to calculate the result
        while (l <= h)
        {
            int m = (l + h) / 2;
            if (isPossible(arr, n, m, k))
            {
                ans = m;
                h = m - 1;
            
            else
            {
                l = m + 1;
            }
        }
  
        return ans;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = {2, 15, 36, 43};
        int n = arr.length;
        int k = 2;
  
        System.out.println(minDistance(arr, n, k));
    }
}
  
/* This code contributed by PrinciRaj1992 */

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach
  
# Function that returns true if it is possible
# to reach end of the array in exactly k jumps
def isPossible(arr, n, dist, k) :
  
    # Variable to store the number of
    # steps required to reach the end
    req = 0
  
    curr = 0
    prev = 0
  
    for i in range(0, n): 
        while (curr != n and (arr[curr] - arr[prev]) <= dist):
            curr = curr + 1
        req = req + 1
  
        if (curr == n):
            break
        prev = curr - 1
      
  
    if (curr != n):
        return False
  
    # If it is possible to reach the
    # end in exactly k jumps
    if (req <= k):
        return True
  
    return False
  
  
# Returns the minimum maximum distance required
# to reach the end of the array in exactly k jumps
def minDistance(arr, n, k):
  
    l = 0
    h = arr[n - 1]
  
    # Stores the answer
    ans = 0
  
    # Binary search to calculate the result
    while (l <= h): 
        m = (l + h) // 2;
        if (isPossible(arr, n, m, k)): 
            ans = m
            h = m - 1
          
        else:
            l = m + 1
      
  
    return ans
  
# Driver code
  
arr = [ 2, 15, 36, 43 ]
n =  len(arr)
k = 2
  
print(minDistance(arr, n, k))
  
# This code is contributed by ihritik

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to implement
// the above approach
using System;
  
class GFG
{
  
    // Function that returns true if it is possible
    // to reach end of the array in exactly k jumps
    static bool isPossible(int []arr, int n, int dist, int k)
    {
  
        // Variable to store the number of
        // steps required to reach the end
        int req = 0;
  
        int curr = 0;
        int prev = 0;
  
        for (int i = 0; i < n; i++)
        {
            while (curr != n && arr[curr] - arr[prev] <= dist)
            {
                curr++;
            }
            req++;
  
            if (curr == n)
            {
                break;
            }
            prev = curr - 1;
        }
  
        if (curr != n)
        {
            return false;
        }
  
        // If it is possible to reach the
        // end in exactly k jumps
        if (req <= k)
        {
            return true;
        }
  
        return false;
    }
  
    // Returns the minimum maximum distance required
    // to reach the end of the array in exactly k jumps
    static int minDistance(int []arr, int n, int k)
    {
        int l = 0;
        int h = arr[n - 1];
  
        // Stores the answer
        int ans = 0;
  
        // Binary search to calculate the result
        while (l <= h)
        {
            int m = (l + h) / 2;
            if (isPossible(arr, n, m, k))
            {
                ans = m;
                h = m - 1;
            
            else
            {
                l = m + 1;
            }
        }
  
        return ans;
    }
  
    // Driver code
    public static void Main(String[] args)
    {
        int []arr = {2, 15, 36, 43};
        int n = arr.Length;
        int k = 2;
  
        Console.WriteLine(minDistance(arr, n, k));
    }
}
  
/* This code contributed by PrinciRaj1992 */

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// Php implementation of the approach 
  
// Function that returns true if it is possible 
// to reach end of the array in exactly k jumps 
function isPossible($arr, $n, $dist, $k
  
    // Variable to store the number of 
    // steps required to reach the end 
    $req = 0; 
  
    $curr = 0; 
    $prev = 0; 
  
    for ($i = 0; $i < $n; $i++)
    
        while ($curr != $n && $arr[$curr] - $arr[$prev] <= $dist
            $curr++; 
        $req++; 
  
        if ($curr == $n
            break
        $prev = $curr - 1; 
    
  
    if ($curr != $n
        return false; 
  
    // If it is possible to reach the 
    // end in exactly k jumps 
    if ($req <= $k
        return true; 
  
    return false; 
  
// Returns the minimum maximum distance required 
// to reach the end of the array in exactly k jumps 
function minDistance($arr, $n, $k
    $l = 0; 
    $h = $arr[$n - 1]; 
  
    // Stores the answer 
    $ans = 0; 
  
    // Binary search to calculate the result 
    while ($l <= $h
    
        $m = floor(($l + $h) / 2); 
        if (isPossible($arr, $n, $m, $k)) 
        
            $ans = $m
            $h = $m - 1; 
        
        else
            $l = $m + 1; 
    
  
    return $ans
  
    // Driver code 
    $arr = array( 2, 15, 36, 43 ); 
    $n = count($arr); 
    $k = 2; 
  
    echo minDistance($arr, $n, $k); 
  
    // This code is contributed by Ryuga
?>

chevron_right


Output:

28


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.