📌  相关文章
📜  在正好k次跳跃中找到到达最后一个岛所需的最小跳跃最大长度的最小值

📅  最后修改于: 2021-04-29 06:39:46             🧑  作者: Mango

给定整数数组arr [] ,其中第i整数表示存在岛的位置,并且整数k (1≤k 0岛上,并且必须到达最后一个岛,以正好k次跳跃的方式从一个岛跳到另一个岛,任务是找到一个人在其旅途中最大跳远的最小值。请注意,所有岛的位置都是按升序给出的。

例子:

方法:想法是使用二进制搜索,并且对于距离mid ,计算是否有可能精确地在k个跳跃中到达数组的末尾,其中选择用于跳跃的任何两个岛之间的最大距离小于或等于k。距离mid ,然后检查是否存在小于mid的某个距离,可以通过准确的k次跳跃达到该距离。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
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;
}


Java
// 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 */


Python3
# 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


C#
// 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 */


PHP


输出:
28