Giả sử chúng ta có một mảng A gồm các số, trong A, số thứ i là vị trí có một đảo và cho trước một số nguyên k khác (1 ≤ k
Vì vậy, nếu đầu vào là A =[7, 20, 41, 48], k =2, thì đầu ra sẽ là 28, vì có hai cách để đạt được đảo cuối cùng là 7 đến 20 đến 48, đây là khoảng cách tối đa giữa hai hòn đảo liên tiếp bất kỳ là từ 48 đến 20 là 28. Và từ 7 đến 41 đến 48 ở đây khoảng cách tối đa giữa hai đảo liên tiếp bất kỳ là từ 41 đến 7 là 34. Vì vậy, tối thiểu của 28 và 34 là 28.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Định nghĩa một hàm isPossible (). Điều này sẽ lấy arr, dist, k
-
n:=kích thước của arr
-
yêu cầu:=0
-
hiện tại:=0
-
trước:=0
-
đối với tôi trong phạm vi từ 0 đến n, hãy thực hiện
-
trong khi hiện tại không giống với n và (arr [hiện tại] - arr [trước]) <=dist, do
-
hiện tại:=current + 1
-
-
req:=req + 1
-
nếu dòng điện giống với n, thì
-
đi ra từ vòng lặp
-
-
trước:=hiện tại - 1
-
-
nếu dòng điện không giống với n, thì
-
trả về Sai
-
-
nếu yêu cầu <=k, thì
-
trả về True
-
-
trả về Sai
-
Từ phương thức chính, thực hiện như sau -
-
n:=kích thước của arr
-
trái:=0
-
right:=phần tử cuối cùng của arr
-
ans:=0
-
trong khi left - =right, thực hiện
-
giữa:=(trái + phải) / 2;
-
nếu isPossible (arr, mid, k) khác 0 thì
-
ans:=mid
-
right:=mid - 1
-
-
nếu không,
-
left:=mid + 1
-
-
-
trả lại ans
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
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))
Đầu vào
[7, 20, 41, 48] , 2
Đầu ra
28