给你一个 n * n 的网格 grid ,上面放置着一些 1 x 1 x 1 的正方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
放置好正方体后,任何直接相邻的正方体都会互相粘在一起,形成一些不规则的三维形体。
请你返回最终这些形体的总表面积。
注意:每个形体的底面也需要计入表面积中。
输入:grid = [[1,2],[3,4]]
输出:34
输入:grid = [[1,1,1],[1,0,1],[1,1,1]]
输出:32
【思路】:
首先,一个柱体一个柱体的看,每个柱体是由:2 个底面(上表面/下表面)+ 所有的正方体都贡献了 4 个侧表面积。
然后,把柱体贴合在一起之后,我们需要把贴合的表面积给减掉,两个柱体贴合的表面积就是 两个柱体高的最小值*2。
作者:sweetiee
链接:https://leetcode.cn/problems/surface-area-of-3d-shapes/solution/shi-li-you-tu-you-zhen-xiang-jiang-jie-yi-kan-jiu-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【代码】:
这里代码写的非常巧妙,遍历过程中,每个柱体只需要减去左边和上边重复的面积。至于下边和右边的面积,由后面的柱体来减。
/**
* @param {number[][]} grid
* @return {number}
*/
var surfaceArea = function(grid) {
let n = grid.length, area = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
let level = grid[i][j];
if (level > 0) {
// 一个柱体中:2个底面 + 所有的正方体都贡献了4个侧表面积
area += (level * 4) + 2;
// 减掉 i 与 i-1 相贴的两份表面积
area -= i > 0? Math.min(level, grid[i - 1][j]) * 2: 0;
// 减掉 j 与 j-1 相贴的两份表面积
area -= j > 0? Math.min(level, grid[i][j - 1]) * 2: 0;
}
}
}
return area;
};