用Python编写程序,找到在一条街上点亮所有房屋所需的最小半径

用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

  • 将i从0到nums的大小进行循环

    • val:=nums[i]

    • 如果val – last_location > r, 然后

      • count := count + 1

      • last_location:= val + r

  • 当计数<= 3时,返回true,否则返回false

  • 从主方法执行以下操作-

  • 对列表nums进行排序

  • left:= 0

  • right:= nums的最后一个元素

  • res:= inf

  • itr:= 0

  • while left <= right and itr < 20, do

    • mid:= left +(right – left) / 2

    • 如果valid(mid)是真的,那么

      • res: = min(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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程