题目:
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。
每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
请你返回最终形体的表面积。
思考:
首先将二维坐标系中的所有方块按照独立的进行计算表面积,即方块数*6,然后计算需要减去的值,两个方块相连,表面积减去2,即分为两步,
1.当前坐标本身,需要减去的表面积为:(方块数-1)*2;
2.当前坐标左边需要减去的表面积为:min(左边方块数,当前方块数)*2;
3.当前坐标上边需要减去的表面积为:min(上边方块数,当前方块数)*2;
class Solution {
public int surfaceArea(int[][] grid) {
int result = 0;
int temp = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
result += grid[i][j]*6;
//坐标点不止一个元素时
if(grid[i][j]>0) {
temp += (grid[i][j] - 1) * 2;
//二维坐标系最上边一行
if(i==0&&j>0){
if(grid[i][j-1]>0){
temp += Math.min(grid[i][j],grid[i][j-1])*2;
}
}
//二维坐标系最最左边一行
if(i>0&&j==0){
if(grid[i-1][j]>0){
temp += Math.min(grid[i][j],grid[i-1][j])*2;
}
}
//二维坐标系其他元素
if(i>0&&j>0){
if(grid[i][j-1]>0){
temp += Math.min(grid[i][j],grid[i][j-1])*2;
}
if(grid[i-1][j]>0){
temp += Math.min(grid[i][j],grid[i-1][j])*2;
}
}
}
}
}
return result - temp;
}
}