Max Increase to Keep City Skyline in Python



Suppose we have a 2-dimensional array called grid, where each value of grid[i][j] represents the height of a building located there. We can increase the height of any number of buildings, by any amount. Height 0 is considered to be a building as well. At the end, the "skyline" when viewed from all four directions of the grid, must be the same as the skyline of the original grid. Because a city's skyline is the outer contour of the rectangles formed by all the buildings when viewed from a distance. So we have to find the maximum total sum that the height of the buildings can be increased.

So, if the input is like

3 0 8 4
2 4 5 7
9 2 3 6
0 3 1 0

then the output will be 35, this is because the skyline viewed from top or bottom is: [9, 4, 8, 7], the skyline viewed from left or right is: [8, 7, 9, 3], So the final matrix can be like −

8 4 8 7
7 4 7 7
9 4 8 7
3 3 3 3

To solve this, we will follow these steps −

  • max_row_wise := a new list

  • max_column_wise := a new list

  • counter := 0

  • for each i in grid, do

    • insert maximum of i at the end of max_row_wise

    • counter := counter + 1

  • counter := 0, i := 0, j := 0

  • temp_list := a new list

  • Do the following infinitely −

    • insert grid[i,j] into temp_list

    • i := i + 1

    • if j is same as size of grid[0] -1 and i>=len(grid), then

      • insert maximum of temp_list at the end of max_column_wise

      • come out from the loop

    • otherwise when i >= size of grid , then

      • i := 0, j := j + 1

      • insert maximum of temp_list at the end of max_column_wise

      • counter := counter + 1

      • temp_list:= a new list

  • top_bottom, left_right := max_row_wise,max_column_wise

  • i, j, value := 0,0,0

  • Do the following infinitely, do

    • temp := minimum of [top_bottom[i], left_right[j]]

    • j := j + 1

    • if j is same as column length of grid and i is same as row count of grid -1, then

      • come out from the loop

    • otherwise when j is same as size of grid column , then

      • i := i+1

      • j := 0

  • return value

Example 

Let us see the following implementation to get a better understanding −

 Live Demo

class Solution:
   def maxIncreaseKeepingSkyline(self, grid):
      max_row_wise = []
      max_column_wise = []
      counter = 0
      for i in grid:
         max_row_wise.append(max(i))
         counter+=1
      counter = 0
      i = 0
      j = 0
      temp_list = []
      while True:
         temp_list.append(grid[i][j])
         i+=1
         if j ==len(grid[0])-1 and i>=len(grid):
            max_column_wise.append(max(temp_list))
            break
         elif i >= len(grid):
            i = 0
            j = j + 1
            max_column_wise.append(max(temp_list))
            counter +=1
            temp_list=[]
      top_bottom, left_right = max_row_wise,max_column_wise
      i, j, value = 0,0,0
      while True:
         temp = min([top_bottom[i], left_right[j]])
         value+= abs(grid[i][j] - temp)
         j+=1
         if j == len(grid[0]) and i==len(grid)-1:
            break
         elif j == len(grid[0]):
            i = i+1
            j = 0
      return value

ob = Solution()
print(ob.maxIncreaseKeepingSkyline([[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,
3,1,0]]))

Input

[[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]

Output

35
Updated on: 2020-11-17T11:09:19+05:30

267 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements