題目描述:在二維陣列grid中,grid[i][j]代表位於某處的建築物的高度。 我們被允許增加任何數量(不同建築物的數量可能不同)的建築物的高度。 高度 0 也被認為是建築物。
最後,從新陣列的所有四個方向(即頂部,底部,左側和右側)**的「天際線」必須與原始陣列的天際線相同。 城市的天際線是從遠處**時,由所有建築物形成的矩形的外部輪廓。 請看下面的例子。
建築物高度可以增加的最大總和是多少?
例子:輸入: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]
輸出: 35
解釋:the grid is:
[ [3, 0, 8, 4],
[2, 4, 5, 7],
[9, 2, 6, 3],
[0, 3, 1, 0] ]
從陣列豎直方向(即頂部,底部)看「天際線」是:[9, 4, 8, 7]
從水平水平方向(即左側,右側)看「天際線」是:[8, 7, 9, 3]
在不影響天際線的情況下對建築物進行增高後,新陣列如下:
gridnew = [ [8, 4, 8, 7],
[7, 4, 7, 7],
[9, 4, 8, 7],
[3, 3, 3, 3] ]
說明:1 < grid.length = grid[0].length <= 50。
grid[i][j] 的高度範圍是: [0, 100]。
一座建築物佔據乙個grid[i][j]:換言之,它們是 1 x 1 x grid[i][j] 的長方體。
題目已經很明確的告訴了我們需要求出行和列的最大值,所以首先我們得求出行的列的最大值,行好求,一行作為乙個元素進行迭代,找出行list中的最大值,列我就像著以列作為迴圈的條件一一比較的出最大值,後來腦子抽風,想著emmm,把這個矩陣轉置了一下,按照行的方式求最大值。
下面計算能增加的最大高度,為了保持行和列的最大值不變,所以每一棟樓能增加的最大層數是這棟樓所在的行列最大值之間的那個小一點的數。我覺得還是蠻好理解的。
**:
class
solution
: def maxincreasekeepingskyline
(self, grid)
:"""
:type grid: list[list[int]
]:rtype: int
"""horizonal=
#存放水平方向最大的數
b=c=
count=
0 vertical=
#存放豎直方向最大的數
for m in grid:
horizonal.
(max
(m))
for i in
range
(len
(grid[0]
)):#列數
for j in
range
(len
(grid)
):#行數
b.(grid[j]
[i])#每列存進乙個陣列
c.(b)#按列存放進乙個二維陣列
b=#列陣列清空
for t in c:
vertical.
(max
(t))
print
(horizonal)
print
(vertical)
for i in
range
(len
(grid)):
for j in
range
(len
(grid[0]
)): minvalue=
min(horizonal[i]
,vertical[j]
)#每棟樓能增肌的最大數是這棟樓所在的水平和數值方向最大值的最小值的數字
count+=minvalue-grid[i]
[j]return count
leetcode807 保持城市天際線
在二維陣列grid中,grid i j 代表位於某處的建築物的高度。我們被允許增加任何數量 不同建築物的數量可能不同 的建築物的高度。高度 0 也被認為是建築物。最後,從新陣列的所有四個方向 即頂部,底部,左側和右側 的 天際線 必須與原始陣列的天際線相同。城市的天際線是從遠處 時,由所有建築物形成...
保持城市天際線 leetcode807
leetcode807 保持城市天際線 即增加陣列中的值,增加後4個行最大值和4個列最大值保持不變即可,求最大增加數量 思路 當增加某一元素的值時,先判斷它是否是行或者列的最大值,如果是,跳過 如果不是,找到它所在行列的最大值,令該元素值 min,遍歷陣列,找打行列最大值,儲存在新的陣列中 遍歷陣列...
leetcode 807 保持城市天際線
在二維陣列grid中,grid i j 代表位於某處的建築物的高度。我們被允許增加任何數量 不同建築物的數量可能不同 的建築物的高度。高度 0 也被認為是建築物。最後,從新陣列的所有四個方向 即頂部,底部,左側和右側 的 天際線 必須與原始陣列的天際線相同。城市的天際線是從遠處 時,由所有建築物形成...