题目描述:
在 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
代码:
class Solution {
public int surfaceArea(int[][] grid) {
int p = 0;
for (int i = 0; i < grid.length - 1; i++) {
for (int j = 0; j < grid[i].length - 1; j++) {
if (grid[i][j] != 0) {
p += 4 * grid[i][j] + 2 - Math.min(grid[i][j], grid[i][j + 1]) * 2 - Math.min(grid[i][j], grid[i + 1][j]) * 2;
}
}
}
for (int i = 0; i < grid.length - 1; i++) {
if (grid[i][grid[i].length - 1] != 0) {
p += 4 * grid[i][grid[i].length - 1] + 2 - Math.min(grid[i][grid[i].length - 1], grid[i + 1][grid[i].length - 1]) * 2;
}
}
for (int i = 0; i < grid[grid.length - 1].length - 1; i++) {
if (grid[grid.length - 1][i] != 0) {
p += 4 * grid[grid.length - 1][i] + 2 - Math.min(grid[grid.length - 1][i], grid[grid.length - 1][i + 1]) * 2;
}
}
if (grid[grid.length - 1][grid[grid.length - 1].length - 1] != 0) {
p += 4 * grid[grid.length - 1][grid[grid.length - 1].length - 1] + 2;
}
return p;
}
}
2020年3月25日的每日一题,虽然是简单题,但是乍一看卡也没有想到有什么简单的解决方案,看了提示才理解可以计算每一个柱状体的面积,最终计算出总面积。
以示例4为例,从图形的角度来讲,这是一个3*3的长方体,中间掏掉一块的样子,所以中间内圈的面积也是算在表面积里面的。
解法就是:
第一个循环:先假设grid[i][j]当前没有相邻的方块,那么表面积为4 * grid[i][j] + 2,然后考虑由于有相邻而被遮挡的面积,为了不重复计算,只计算右边和下边的相邻的方块,其中遮挡的面积为两个柱体矮的面积的两倍;
第二个和第三个循环:单独计算最右边和最下面的表面积,因为这两个地方的方块只可能有一个方向上存在遮挡。
最后计算最右下那个柱体,这个是没有遮挡的。
最后将所有的表面积加起来就是全部所有的表面积了。