在Python中准确地以k次跳跃找到到达最后一个岛所需的最大跳跃最小长度

假设我们有一个数字数组A,在A中,第i个数字是出现孤岛的位置,并且给出了另一个整数k(1≤k <N)。现在,一个人站在第0个岛上,并且必须到达最后一个岛,以正好k次跳跃的方式从一个岛跳到另一个岛,我们必须找到一个人将要进行的最大跳跃长度的最小值他/她的旅程。我们必须记住,所有岛屿的位置都是按升序排列的。

因此,如果输入像A = [7,20,41,48],k = 2,则输出将为28,因为有两种方法可以到达最后一个岛7至20至48,这里是最大距离两个连续的岛之间的距离在48和20之间,即28。7到41到48,这里两个连续的岛之间的最大距离在41和7之间,即34。因此,28和34的最小值是28。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个功能isPossible()。这将需要arr,dist,k

  • n:= arr的大小

  • 要求:= 0

  • 当前:= 0

  • 上一个:= 0

  • 对于0到n范围内的i,执行

    • 从循环中出来

    • 当前:=当前+ 1

    • 而当前与n不相同,并且(arr [current]-arr [上一个])<= dist,

    • 要求:=要求+ 1

    • 如果电流与n相同,则

    • 上一个:=当前-1

    • 如果电流与n不同,则

      • 返回False

    • 如果req <= k,则

      • 返回True

    • 返回False

    • 从主要方法中,执行以下操作-

    • n:= arr的大小

    • 左:= 0

    • 右:= arr的最后一个元素

    • 回答:= 0

    • 当左-=右时

      • 左:=中+ 1

      • ans:=中

      • 右:=中-1

      • 中:=(左+右)/ 2;

      • 如果isPossible(arr,mid,k)不为零,则

      • 除此以外,

      • 返回ans

      例 

      让我们看下面的实现以更好地理解-

      def isPossible(arr,dist, k) :
         n = len(arr)
         req = 0
         current = 0
         previous = 0
         for i in range(0, n):
            while (current != n and (arr[current] - arr[previous]) <= dist):
               current += 1
            req += 1
            if (current == n):
               break
            previous = current - 1
         if (current != n):
            return False
         if (req <= k):
            return True
         return False
      def minimum_distance(arr, k):
         n = len(arr)
         left = 0
         right = arr[-1]
         ans = 0
         while (left <= right):
            mid = (left + right) // 2;
            if (isPossible(arr, mid, k)):
               ans = mid
               right = mid - 1
            else:
               left = mid + 1
         return ans
      arr = [7, 20, 41, 48]
      k = 2
      print(minimum_distance(arr, k))

      输入值

      [7, 20, 41, 48] , 2

      输出结果

      28
      猜你喜欢