892. 三维形体的表面积
题目
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。
每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
请你返回最终形体的表面积。
- 1 <= N <= 50
- 0 <= grid[i][j] <= 50
测试用例
输入:[[2]]
输出:10
输入:[[1,2],[3,4]]
输出:34
分析
计算不规则立方体堆的表面积,rid[i][j]表示第 i 行 第 j 列的方块个数
- 先假设每一摞的立方体互不接触:
通过遍历累加,可以计算出每一摞立方体的表面积及不接触情况下的总表面积 - 再考虑接触的需要减去的部分:
一旦两摞立方体接触,那么被抵消掉的表面积应该是较矮的那一摞的高度*2 - 关于计算顺序:
可以假设从第 0 行第 0 列开始,
每次新增一摞的时候,加上把当前摞作为独立情况下的表面积,同时减去与左侧,上侧有接触面时抵消掉的面积,直到第 i 行第 j 列结束循环体,输出结果
题解
/**
* @param {number[][]} grid
* @return {number}
*/
var surfaceArea = function(grid) {
let result=0;
for(let i=0;i<grid.length;i++){
for(let 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])*2;
}
if(j>0){
result -= Math.min(grid[i][j-1],grid[i][j])*2;
}
}
}
return result;
};
性能
