Description:
On a N * N grid, we place some 1 * 1 * 1 cubes.
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:
Input: [[2]]
Output: 10
Example 2:
Input: [[1,2],[3,4]]
Output: 34
Example 3:
Input: [[1,0],[0,2]]
Output: 16
Example 4:
Input: [[1,1,1],[1,0,1],[1,1,1]]
Output: 32
Example 5:
Input: [[2,2,2],[2,1,2],[2,2,2]]
Output: 46
Note:
- 1 <= N <= 50
- 0 <= grid[i][j] <= 50
题意:给定一个二维数组,每个元素表示当前位置立方体的个数(每个立方体为111),要求计算二维数组中所有立方体在三维空间中的表面积;
解法:对于每个位置的立方体来说,如果高度为h,那么这个位置的表面积为S1=h * 6 - 2 * (h - 1);如果,这个立方体与周围的立方体是相邻的,我们还要扣除与之相邻的那部分表面积;此时,S1 -= 前、后、左、右与之相邻的表面积;最后的表面积Area = S1 + S2 + …+ Sn;
Java
class Solution {
public int surfaceArea(int[][] grid) {
int area = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
if (grid[i][j] == 0) continue;
area += 6 * grid[i][j] - 2 * (grid[i][j] - 1);
area -= reduceAround(grid, i, j);
}
}
return area;
}
private int reduceAround(int[][] grid, int row, int col) {
int reduce = 0;
if (row - 1 >= 0) reduce += Math.min(grid[row][col], grid[row - 1][col]);
if (row + 1 < grid.length) reduce += Math.min(grid[row][col], grid[row + 1][col]);
if (col - 1 >= 0) reduce += Math.min(grid[row][col], grid[row][col - 1]);
if (col + 1 < grid[row].length) reduce += Math.min(grid[row][col], grid[row][col + 1]);
return reduce;
}
}