参考链接
- https://leetcode-cn.com/problems/max-increase-to-keep-city-skyline/
题目描述
在二维数组grid中,grid[i][j]代表位于某处的建筑物的高度。 我们被允许增加任何数量(不同建筑物的数量可能不同)的建筑物的高度。 高度 0 也被认为是建筑物。
最后,从新数组的所有四个方向(即顶部,底部,左侧和右侧)观看的“天际线”必须与原始数组的天际线相同。 城市的天际线是从远处观看时,由所有建筑物形成的矩形的外部轮廓。 请看下面的例子。
建筑物高度可以增加的最大总和是多少?
解题思路
从顶部和底部看到的是列上的最大值,从两侧看到的是行上的最大值。要保持城市的天际线,就需要保持行和列的最大值。于是,遍历一次二维数组,将行和列的最大值存储起来,再次遍历时,将当前位置的建筑物升高到两个最大值中的最小值。
代码
class Solution {
public:
int maxIncreaseKeepingSkyline(vector<vector<int>>& grid) {
vector<int> row_max(grid.size());
vector<int> col_max(grid[0].size());
int res = 0;
for (int i = 0; i < grid.size(); i ++)
{
for (int j = 0; j < grid[0].size(); j ++)
{
row_max[i] = max(row_max[i], grid[i][j]);
col_max[j] = max(col_max[j], grid[i][j]);
}
}
for (int i = 0; i < grid.size(); i ++)
{
for (int j = 0; j < grid[0].size(); j ++)
{
res += min(row_max[i], col_max[j]) - grid[i][j];
}
}
return res;
}
};