计算几何-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; }