解题思路: 解决此类题目一定要剖析清楚题目的意思,其实就是数组中每个数所能够增加到的数是同行和同列中最大值之间的最小值,这样正好符合天际线的定义。那么我们直接一次遍历统计每行每列的最大值,最后再次遍历一遍数据,计算每个建筑物所能增加的高度即可,代码如下:
class Solution {
public:
int maxIncreaseKeepingSkyline(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
int count = 0;
vector<int> level(m, 0);
vector<int> vertical(n, 0);
for(int i = 0; i < m; i ++) {
for(int j = 0; j < n; j ++) {
vertical[i] = max(vertical[i], grid[i][j]);
level[j] = max(level[j], grid[i][j]);
}
}
for(int i = 0 ; i < m; i ++) {
for(int j = 0; j < n; j ++) {
count += min(level[i], vertical[j]) - grid[i][j];
}
}
return count;
}
};
|