892. 三维形体的表面积
链接
题目描述
思路
计算所有的正方体的总个数
,总的表面积就是 6 * 总个数
每有一个重合面,表面积就会减少 2
再去找重合面:
- 同一个格子上存在数量 > 2 的正方体,重合面 = 个数 - 1
- 左右重合
- 上下重合
class Solution {
public int surfaceArea(int[][] grid) {
if(grid == null || grid.length == 0){
return 0;
}
int coincide = 0;
int sumNum = 0;
for(int i = 0 ; i < grid.length ;i++){
for(int j = 0; j < grid[0].length ; j++){
//左右重合
if(j < grid[0].length-1){
coincide += Math.min(grid[i][j],grid[i][j+1]);
}
//上下重合
if(i < grid.length-1 ){
coincide += Math.min(grid[i][j],grid[i+1][j]);
}
//同一个格子上重合
if(grid[i][j] > 1){
coincide += grid[i][j]-1;
}
sumNum += grid[i][j];
}
}
return 6*sumNum - 2*coincide;
}
}
更简洁的写法,使用了位运算
针对每个柱体而言:表面积为上下两个表面以及每个正方体 4 个侧面
减去重合的就可以
class Solution {
public int surfaceArea(int[][] grid) {
if(grid == null || grid.length == 0){
return 0;
}
int n = grid.length;
int area = 0;
for(int i = 0; i < n;i++){
for(int j = 0; j < n;j++){
int level = grid[i][j];
if(level > 0){
area += (level << 2) + 2;
area -= i > 0 ? ((Math.min(level,grid[i-1][j])) << 1) : 0;
area -= j > 0 ? ((Math.min(level,grid[i][j-1])) << 1) : 0;
}
}
}
return area;
}
}