本文最后更新于:2023年3月19日 晚上
Lt892. 三维形体的表面积
给你一个 n * n
的网格 grid
,上面放置着一些 1 x 1 x 1
的正方体。 每个值 v = grid[i][j]
表示 v
个正方体叠放在对应单元格 (i, j)
上。 放置好正方体后,任何直接相邻的正方体都会互相粘在一起,形成一些不规则的三维形体。 请你返回最终这些形体的总表面积。注意: 每个形体的底面也需要计入表面积中。示例 1:
示例 2:
1 2 输入:grid = [[1,2],[3,4]] 输出:34
示例 3:
1 2 输入:grid = [[1,0],[0,2]] 输出:16
示例 4:
1 2 输入:grid = [[1,1,1],[1,0,1],[1,1,1]] 输出:32
示例 5:
1 2 输入:grid = [[2,2,2],[2,1,2],[2,2,2]] 输出:46
提示:
n == grid.length
n == grid[i].length
1 <= n <= 50
0 <= grid[i][j] <= 50
思路 遍历每个元素,先计算出叠放后的表面积,再减去上下左右被遮挡的面积
解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var surfaceArea = function (grid ) { let res = 0 ; for (let i = 0 ; i < grid.length; i++) { for (let j = 0 ; j < grid[0 ].length; j++) { const cur = grid[i][j]; if (!cur) continue ; const top = i - 1 >= 0 ? grid[i - 1 ][j] : 0 ; const bottom = i + 1 < grid.length ? grid[i + 1 ][j] : 0 ; const left = grid[i][j - 1 ]; const right = grid[i][j + 1 ]; const area = cur * 6 - 2 * (cur - 1 ); const topArea = Math .min(cur, top); const bottomArea = Math .min(cur, bottom); const leftArea = Math .min(cur, left ? left : 0 ); const rightArea = Math .min(cur, right ? right : 0 ); res += area - topArea - bottomArea - leftArea - rightArea; } } return res; };