三维形体的表面积
难度:
标签:
题目描述
给你一个 n * n
的网格 grid
,上面放置着一些 1 x 1 x 1
的正方体。每个值 v = grid[i][j]
表示 v
个正方体叠放在对应单元格 (i, j)
上。
放置好正方体后,任何直接相邻的正方体都会互相粘在一起,形成一些不规则的三维形体。
请你返回最终这些形体的总表面积。
注意:每个形体的底面也需要计入表面积中。
示例 1:

输入:grid = [[1,2],[3,4]] 输出:34
示例 2:

输入:grid = [[1,1,1],[1,0,1],[1,1,1]] 输出:32
示例 3:

输入: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
代码结果
运行时间: 38 ms, 内存: 16.0 MB
/*
* 思路:
* 使用Java Stream来简化遍历过程,计算每个单元格的表面积。
* 对于每个单元格,如果堆叠了n个正方体,表面积为6*n - 2*(n-1)。
* 我们还需要减去与相邻单元格相邻部分的表面积。
* 最后返回总表面积。
*/
import java.util.stream.IntStream;
public int surfaceArea(int[][] grid) {
int n = grid.length;
return IntStream.range(0, n).map(i -> IntStream.range(0, n).map(j -> {
if (grid[i][j] == 0) return 0;
int area = 6 * grid[i][j] - 2 * (grid[i][j] - 1);
if (i > 0) area -= Math.min(grid[i][j], grid[i - 1][j]) * 2;
if (j > 0) area -= Math.min(grid[i][j], grid[i][j - 1]) * 2;
return area;
}).sum()).sum();
}
解释
方法:
此题解首先遍历网格中的每个单元格,计算每个单元格上正方体的底面和顶面总面积。如果一个单元格中的正方体数量大于0,则它有底面和顶面,因此为每个正方体增加2的面积。对于侧面积,考虑每个单元格在横向和纵向与其相邻单元格之间的正方体数量差值。通过计算这些差值的绝对值,可以得到正方体间未被相邻正方体覆盖的侧面面积。遍历完成后,将底面和顶面的总面积与侧面面积加和,得到最终的结果。
时间复杂度:
O(n^2)
空间复杂度:
O(1)
代码细节讲解
🦆
在题解中提到,每个正方体都计算了顶面和底面,为什么需要对每个正方体独立增加这两个面的面积,而不是直接对有正方体的单元格计算?
▷🦆
题解中提到计算侧面面积时通过正方体高度差进行计算,能否解释一下为什么使用高度差来确定侧面面积?
▷🦆
在计算侧面面积时,题解考虑了每个正方体与横向和纵向相邻正方体的高度差,这种计算方式是否考虑了网格的边界情况,例如网格的最外围?
▷🦆
题解中提到在每一行和每一列的结束时加上最后一个正方体的高度,这样做的目的是什么?
▷