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