计算几何-892. 三维形体的表面积
2020-03-25 15:47:14
问题描述:
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。
每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
请你返回最终形体的表面积。
示例 1:
输入:[[2]]
输出:10
示例 2:
输入:[[1,2],[3,4]]
输出:34
示例 3:
输入:[[1,0],[0,2]]
输出:16
示例 4:
输入:[[1,1,1],[1,0,1],[1,1,1]]
输出:32
示例 5:
输入:[[2,2,2],[2,1,2],[2,2,2]]
输出:46
提示:
1 <= N <= 50
0 <= grid[i][j] <= 50
问题求解:
直接去运算每行每列的最大值,然后计算是不对的,因为可能会存在中间有空洞的情况,导致表面积计算减少。
正确的计算方式是每个柱体进行单独计算,并且逐行逐列的减去重复的部分。
时间复杂度:O(n ^ 2)
public int surfaceArea(int[][] grid) {
int res = 0;
int n = grid.length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] != 0) res += grid[i][j] * 4 + 2;
if (i > 0) res -= Math.min(grid[i - 1][j], grid[i][j]) * 2;
if (j > 0) res -= Math.min(grid[i][j - 1], grid[i][j]) * 2;
}
}
return res;
}

浙公网安备 33010602011771号