leetcode-892-Surface-Area-of-3D-Shapes

描述


On a N * N grid, we place some 1 * 1 * 1cubes.

Each value v = grid[i][j] represents a tower of v cubes placed on top of grid cell (i, j).

Return the total surface area of the resulting shapes.

Example 1:

1
2
Input: [[2]]
Output: 10

Example 2:

1
2
Input: [[1,2],[3,4]]
Output: 34

Example 3:

1
2
Input: [[1,0],[0,2]]
Output: 16

Example 4:

1
2
Input: [[1,1,1],[1,0,1],[1,1,1]]
Output: 32

Example 5:

1
2
Input: [[2,2,2],[2,1,2],[2,2,2]]
Output: 46

Note:

  • 1 <= N <= 50
  • 0 <= grid[i][j] <= 50

分析


题意是给定一个二维数组 grid,grid[i][j] 表示(i, j) 上放置的立方体的数量,求这个整体的表面积。思路是先不考虑重叠的部分,根据 rid[i][j]*4+2 得到所有立方体的表面积,接在在遍历的过程中减去重叠的部分。

需要注意的是这道题跟 883. Projection Area of 3D Shapes 有点像,但还是有区别的,883 那道题是求投影,会有高的挡住矮的情况,并不是整体的表面积的一半。

解决方案1Java)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public int surfaceArea(int[][] grid) {
int result = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
if (grid[i][j] > 0) {
result += grid[i][j] * 4 + 2;
}

if (i > 0) {
result -= Math.min(grid[i-1][j], grid[i][j]);
}
if (i < grid.length-1) {
result -= Math.min(grid[i+1][j], grid[i][j]);
}
if (j > 0) {
result -= Math.min(grid[i][j], grid[i][j-1]);
}
if (j < grid[i].length-1) {
result -= Math.min(grid[i][j], grid[i][j+1]);
}
}
}
return result;
}
}

题目来源