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
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
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