假设我们有一个称为grid的二维数组,其中grid [i] [j]的每个值代表位于其中的建筑物的高度。我们可以增加任意数量的建筑物的高度。高度0也被视为建筑物。最后,从网格的所有四个方向查看时,“天际线”必须与原始网格的天际线相同。因为从远处看,城市的天际线是所有建筑物形成的矩形的外部轮廓。因此,我们必须找到可以增加建筑物高度的最大总和。
所以,如果输入像
3 | 0 | 8 | 4 |
2 | 4 | 5 | 7 |
9 | 2 | 3 | 6 |
0 | 3 | 1 | 0 |
那么输出将为35,这是因为从顶部或底部观看的天际线为:[9、4、8、7],从左侧或右侧观看的天际线为:[8、7、9、3],因此最终矩阵可以像-
8 | 4 | 8 | 7 |
7 | 4 | 7 | 7 |
9 | 4 | 8 | 7 |
3 | 3 | 3 | 3 |
为了解决这个问题,我们将遵循以下步骤-
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