Python程式:查詢照亮街道上所有房屋的最小半徑
假設我們有一個名為nums的數字列表,代表一維線上房屋的位置。現在考慮我們可以將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
count := 1
對於範圍從0到nums大小的i,執行:
val := nums[i]
如果 val - last_location > r,則
count := count + 1
last_location := val + r
當count <= 3時返回true,否則返回false
從主方法執行以下操作:
對列表nums進行排序
left := 0
right := nums的最後一個元素
res := inf
itr := 0
當 left <= right 且 itr < 20 時,執行:
mid := left +(right - left) / 2
如果valid(mid)為true,則
res := res和mid的最小值
right := mid
否則,
left := mid
itr := itr + 1
返回res
示例
讓我們看看下面的實現以更好地理解:
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
廣告