用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的大小
req := 0
current := 0
previous := 0
對於範圍從0到n的i,執行以下操作:
當current不等於n且(arr[current] - arr[previous]) <= dist時,執行以下操作:
current := current + 1
req := req + 1
如果current等於n,則:
退出迴圈
previous := current - 1
如果current不等於n,則:
返回False
如果req <= k,則:
返回True
返回False
從主方法中,執行以下操作:
n := arr的大小
left := 0
right := arr的最後一個元素
ans := 0
當left <= right時,執行以下操作:
mid := (left + right) / 2;
如果isPossible(arr, mid, k)不為零,則:
ans := mid
right := mid - 1
否則:
left := mid + 1
返回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