解决方案
方法:分块累加
思路
让我们试着计算 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中的行和列的数目。 -
空间复杂度:。