LeetCode每日一题

341 阅读1分钟

保持城市天际线

image.png

题目分析

  • 本题是一道贪心运用题,要建筑物总增加高度最大我们需要在每个位置都取得最大增加高度(局部最优)
  • 我们预先计算出grid中每行(cross数组存储)(cross数组存储)的最大值,以及每列(vertical数组存储)(vertical数组存储)的最大值,然后统计min(cross[i],vertical[j])grid[i][j]min(cross[i],vertical[j])-grid[i][j]每个位置能够增加多少。

代码

/**
 * @param {number[][]} grid
 * @return {number}
 */
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;
};