解决方案


方法:分块累加

思路

让我们试着计算 v = grid[i][j] 所贡献的表面积。

v > 0 时,顶面和底面的面积之和为 2。

然后,对于列 grid[i][j] 的每一侧(西,北,东,南),值为 nv 的相邻单元意味着这些方块贡献了 max(v - nv, 0) 的面积。

例如,对于 grid = [[1, 5]]grid[0][1] 贡献的表面积是 2 + 5 + 5 + 5 + 4。其中 2 来自顶部和底部;5 来自北、东、南三面;4 来自西面,其中 1 个单位被邻列覆盖。

算法

对于每个 v = grid[r][c] > 0,计算 ans += 2,对于 grid[r][c] 附近的每个相邻值 nv 还要加上 ans += max(v - nv, 0)

复杂度分析

  • 时间复杂度:,其中 grid 中的行和列的数目。

  • 空间复杂度: