
题目分析
- 本题是一道贪心运用题,要建筑物总增加高度最大我们需要在每个位置都取得最大增加高度(局部最优)
- 我们预先计算出grid中每行(cross数组存储)的最大值,以及每列(vertical数组存储)的最大值,然后统计min(cross[i],vertical[j])−grid[i][j]每个位置能够增加多少。
代码
let maxIncreaseKeepingSkyline = function (grid) {
const { length } = grid;
const cross = new Array(length).fill(0);
const vertical = new Array(length).fill(0);
for (let i = 0; i < length; ++i) {
for (let j = 0; j < length; ++j) {
cross[i] = Math.max(cross[i], grid[i][j]);
vertical[j] = Math.max(vertical[j], grid[i][j]);
}
}
let result = 0;
for (let i = 0; i < length; ++i) {
for (let j = 0; j < length; ++j) {
result += Math.min(cross[i], vertical[j]) - grid[i][j];
}
}
return result;
};