最大增加量以保持Python的城市天际线

假设我们有一个称为grid的二维数组,其中grid [i] [j]的每个值代表位于其中的建筑物的高度。我们可以增加任意数量的建筑物的高度。高度0也被视为建筑物。最后,从网格的所有四个方向查看时,“天际线”必须与原始网格的天际线相同。因为从远处看,城市的天际线是所有建筑物形成的矩形的外部轮廓。因此,我们必须找到可以增加建筑物高度的最大总和。

所以,如果输入像

3084
2457
9236
0310

那么输出将为35,这是因为从顶部或底部观看的天际线为:[9、4、8、7],从左侧或右侧观看的天际线为:[8、7、9、3],因此最终矩阵可以像-

8487
7477
9487
3333

为了解决这个问题,我们将遵循以下步骤-

  • max_row_wise:=一个新列表

  • max_column_wise:=一个新列表

  • 计数器:= 0

  • 对于网格中的每个i

    • 在max_row_wise的末尾插入i的最大值

    • 计数器:=计数器+ 1

  • 计数器:= 0,i:= 0,j:= 0

  • temp_list:=一个新列表

  • 无限执行以下操作-

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

    • 在max_column_wise的末尾插入temp_list的最大值

    • 计数器:=计数器+ 1

    • temp_list:=一个新列表

    • 在max_column_wise的末尾插入temp_list的最大值

    • 从循环中出来

    • 将grid [i,j]插入temp_list

    • 我:=我+ 1

    • 如果j与grid [0] -1的大小相同且i> = len(grid),则

    • 否则,当i> = grid的大小时,则

    • top_bottom,left_right:= max_row_wise,max_column_wise

    • i,j,值:= 0,0,0

    • 无限执行以下操作

      • 我:=我+1

      • j:= 0

      • 从循环中出来

      • temp:= [top_bottom [i],left_right [j]]的最小值

      • j:= j + 1

      • 如果j与网格的列长相同,而i与网格-1的行数相同,则

      • 否则,当j与网格列的大小相同时,则

      • 返回值

      例 

      让我们看下面的实现以更好地理解-

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

      输入值

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

      输出结果

      35