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