Program to find minimum radius to light up all houses on a street in Python



Suppose we have a list of numbers called nums that are representing position of houses on a 1-dimensional line. Now consider we have 3 street lights that we can put anywhere on the line and a light at position x lights up all houses in range [x - r, x + r], inclusive. We have to find the smallest r required to light up all houses.

So, if the input is like nums = [4,5,6,7], then the output will be 0.5, as we can place the lamps on 4.5, 5.5 and 6.5 so r = 0.5. So these three lights can light up all 4 houses.

To solve this, we will follow these steps −

  • Define a function valid() . This will take r

  • last_location := nums[0] + r

  • count := 1

  • for i in range 0 to size of nums, do

    • val := nums[i]

    • if val - last_location > r, then

      • count := count + 1

      • last_location := val + r

  • return true when count <= 3, otherwise false

  • From the main method do the following −

  • sort the list nums

  • left := 0

  • right := last element of nums

  • res := inf

  • itr := 0

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

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

    • if valid(mid) is true, then

      • res := minimum of res and mid

      • right := mid

    • otherwise,

      • left := mid

      • itr := itr + 1

  • return res

Example 

Let us see the following implementation to get better understanding −

 Live Demo

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))

Input

[4,5,6,7]

Output

0.5
Updated on: 2020-12-22T06:18:26+05:30

722 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements