N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。

每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。

请你返回最终形体的表面积。

示例 1:

1
2
输入:[[2]]
输出:10

示例 2:

1
2
输入:[[1,2],[3,4]]
输出:34

示例 3:

1
2
输入:[[1,0],[0,2]]
输出:16

示例 4:

1
2
输入:[[1,1,1],[1,0,1],[1,1,1]]
输出:32

示例 5:

1
2
输入:[[2,2,2],[2,1,2],[2,2,2]]
输出:46

提示:

  • 1 <= N <= 50
  • 0 <= grid[i][j] <= 50
个人解答
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* @param {number[][]} grid
* @return {number}
*/
var surfaceArea = function(grid) {
var res = 0;
var rows = grid.length;
var cols = grid[0].length;

for (var i = 0; i < rows; i++) {
for (var j = 0; j < cols; j++) {
var n = grid[i][j];
if (n > 0) {
// 数学公式 6n - 2(n - 1)
// 累加,并排除叠加部分面积
res += 6 * n - 2 * (n - 1);
/**
* 减去与邻居重叠部分面积
*/
res -= Math.min((i - 1 >= 0 ? ~~grid[i-1][j] : 0), n); // 上
res -= Math.min((i + 1 < rows ? ~~grid[i+1][j] : 0), n); // 下
res -= Math.min((j - 1 >= 0 ? ~~grid[i][j-1] : 0), n); // 左
res -= Math.min((j + 1 < cols ? ~~grid[i][j+1] : 0), n); // 右
}
}
}

return res;
};
执行结果

执行用时: 60 ms, 在所有 JavaScript 提交中击败了 94.87% 的用户;
内存消耗: 35.3 MB, 在所有 JavaScript 提交中击败了 56.67% 的用户。