In a 2 dimensional array grid
, each value grid[i][j]
represents the height of a building located there. We are allowed to increase the height of any number of buildings, by any amount (the amounts can be different for different buildings). Height 0 is considered to be a building as well.
At the end, the "skyline" when viewed from all four directions of the grid, i.e. top, bottom, left, and right, must be the same as the skyline of the original grid. A city's skyline is the outer contour of the rectangles formed by all the buildings when viewed from a distance. See the following example.
What is the maximum total sum that the height of the buildings can be increased?
Example: Input: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]] Output: 35 Explanation: The grid is: [ [3, 0, 8, 4], [2, 4, 5, 7], [9, 2, 6, 3], [0, 3, 1, 0] ] The skyline viewed from top or bottom is: [9, 4, 8, 7] The skyline viewed from left or right is: [8, 7, 9, 3] The grid after increasing the height of buildings without affecting skylines is: gridNew = [ [8, 4, 8, 7], [7, 4, 7, 7], [9, 4, 8, 7], [3, 3, 3, 3] ]
Notes:
1 < grid.length = grid[0].length <= 50
.- All heights
grid[i][j]
are in the range[0, 100]
. - All buildings in
grid[i][j]
occupy the entire grid cell: that is, they are a1 x 1 x grid[i][j]
rectangular prism.
在二维数组中grid
,每个值grid[i][j]
表示位于那里的建筑物的高度。我们被允许以任何数量增加任何数量的建筑物的高度(不同建筑物的数量可以不同)。高度0也被认为是建筑物。
最后,从网格的所有四个方向(即顶部,底部,左侧和右侧)观察时的“天际线”必须与原始网格的天际线相同。城市的天际线是从远处观看时由所有建筑物形成的矩形的外部轮廓。请参阅以下示例。
建筑物高度可以增加的最大总和是多少?
示例: 输入: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]] 输出: 35 说明: 网格为: [[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]
矩形棱柱。
解题思路:从这道题的含义看,天际线是每行的最大值和每列的最大值组成,所以对于任意的第grid[i][j]而言,求以grid[i][j]为十字形可取的最大值 即 min(max(row [i],col [j] ))
class Solution { public: int maxIncreaseKeepingSkyline(vectorint>>& grid) { int m = grid.size(), n = grid[0].size(), res = 0; vector<int> row(m, 0), col(n, 0); for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { row[i] = max(row[i], grid[i][j]); col[j] = max(col[j], grid[i][j]); } } for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { res += min(row[i] - grid[i][j], col[j] - grid[i][j]); } } return res; } };