题目

在 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 列的方块个数

  1. 先假设每一摞的立方体互不接触:
    通过遍历累加,可以计算出每一摞立方体的表面积及不接触情况下的总表面积
  2. 再考虑接触的需要减去的部分:
    一旦两摞立方体接触,那么被抵消掉的表面积应该是较矮的那一摞的高度*2
  3. 关于计算顺序:
    可以假设从第 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;
};

性能