สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums ซึ่งแสดงถึงตำแหน่งของบ้านบนเส้น 1 มิติ ตอนนี้ให้พิจารณาว่าเรามีไฟถนน 3 ดวงที่เราสามารถติดไว้ที่ใดก็ได้บนเส้น และไฟที่ตำแหน่ง x จะส่องสว่างบ้านทุกหลังในระยะ [x - r, x + r] รวมอยู่ด้วย เราต้องหา r ที่เล็กที่สุดที่จำเป็นในการส่องสว่างบ้านทุกหลัง
ดังนั้นหากอินพุตมีค่าเท่ากับ nums =[4,5,6,7] เอาต์พุตจะเป็น 0.5 เนื่องจากเราสามารถวางหลอดไฟไว้ที่ 4.5, 5.5 และ 6.5 ดังนั้น r =0.5 ดังนั้นไฟสามดวงนี้จึงสามารถส่องสว่างบ้านทั้ง 4 หลังได้
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน valid() นี่จะใช้เวลา r
-
last_location :=nums[0] + r
-
นับ :=1
-
สำหรับฉันในช่วง 0 ถึงขนาดของ nums ทำ
-
val :=nums[i]
-
ถ้า val - last_location> r แล้ว
-
นับ :=นับ + 1
-
last_location :=val + r
-
-
-
คืนค่า จริง เมื่อนับ <=3 มิฉะนั้น เท็จ
-
จากวิธีหลักให้ทำดังต่อไปนี้ -
-
เรียงเลขรายการ
-
ซ้าย :=0
-
right :=องค์ประกอบสุดท้ายของ nums
-
res :=inf
-
itr :=0
-
ในขณะที่ซ้าย <=ขวาและมัน <20 ทำ
-
กลาง :=ซ้าย +(ขวา - ซ้าย) / 2
-
ถ้า valid(mid) เป็นจริง แล้ว
-
res :=ความละเอียดขั้นต่ำและกลาง
-
ขวา :=กลาง
-
-
มิฉะนั้น
-
ซ้าย :=กลาง
-
itr :=itr + 1
-
-
-
ผลตอบแทน
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
class Solution: def solve(self, nums): def valid(r): last_location = nums[0] + r count = 1 for i in range(len(nums)): val = nums[i] if val - last_location > r: count += 1 last_location = val + r return count <= 3 nums.sort() left = 0 right = nums[-1] res = float("inf") itr = 0 while left <= right and itr < 20: mid = left + (right - left) / 2 if valid(mid): res = min(res, mid) right = mid else: left = mid itr += 1 return res ob = Solution() nums = [4,5,6,7] print(ob.solve(nums))
อินพุต
[4,5,6,7]
ผลลัพธ์
0.5