สมมติว่าเรามีอาร์เรย์ A ของตัวเลข ใน A หมายเลข i-th คือตำแหน่งที่มีเกาะอยู่ และให้จำนวนเต็ม k อีกตัวหนึ่ง (1 ≤ k
ดังนั้นหากอินพุตเป็น A =[7, 20, 41, 48], k =2 เอาต์พุตจะเป็น 28 เนื่องจากมีสองวิธีในการไปถึงเกาะสุดท้าย 7 ถึง 20 ถึง 48 นี่คือระยะทางสูงสุด ระหว่างเกาะสองเกาะที่ต่อเนื่องกันคือระหว่าง 48 ถึง 20 นั่นคือ 28 และ 7 ถึง 41 ถึง 48 ที่นี่ระยะห่างสูงสุดระหว่างเกาะสองเกาะที่ต่อเนื่องกันคือระหว่าง 41 ถึง 7 นั่นคือ 34 ดังนั้นขั้นต่ำ 28 และ 34 คือ 28 /P>
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน isPossible() นี่จะใช้เวลา arr,dist, k
-
n :=ขนาดของ arr
-
ต้องการ :=0
-
ปัจจุบัน :=0
-
ก่อนหน้า :=0
-
สำหรับผมอยู่ในช่วง 0 ถึง n ทำ
-
ในขณะที่กระแสไม่เหมือนกับ n และ (arr[current] - arr[previous]) <=dist, do
-
ปัจจุบัน :=ปัจจุบัน + 1
-
-
req :=req + 1
-
ถ้ากระแสเท่ากับ n แล้ว
-
ออกจากวง
-
-
ก่อนหน้า :=ปัจจุบัน - 1
-
-
ถ้ากระแสไม่เหมือนกับ n แล้ว
-
คืนค่าเท็จ
-
-
ถ้า req <=k แล้ว
-
คืนค่า True
-
-
คืนค่าเท็จ
-
จากวิธีหลัก ให้ทำดังนี้ −
-
n :=ขนาดของ arr
-
ซ้าย :=0
-
right :=องค์ประกอบสุดท้ายของ arr
-
ตอบ :=0
-
ขณะที่ซ้าย −=ขวา ทำ
-
กลาง :=(ซ้าย + ขวา) / 2;
-
ถ้า isPossible(arr, mid, k) ไม่ใช่ศูนย์ ดังนั้น
-
ตอบ :=กลาง
-
ขวา :=กลาง - 1
-
-
มิฉะนั้น
-
ซ้าย :=กลาง + 1
-
-
-
กลับมาอีกครั้ง
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
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