思路:
求表面积,要总面积减去重复的面积*2;但是这种方式不是很适用于遍历计算,更直接方便的方式是按照每个格计算所展示出的表面积,也就是说:
上下表面积 + 4x四个周围的面积 - 四周与别的位置重复的面积(重复的为相交最矮的那个)。然后每个叠加即可
题目:
- 三维形体的表面积
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。
每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
请你返回最终形体的表面积。
示例 1:
输入:[[2]]
输出:10
示例 2:
输入:[[1,2],[3,4]]
输出:34
示例 3:
输入:[[1,0],[0,2]]
输出:16
示例 4:
输入:[[1,1,1],[1,0,1],[1,1,1]]
输出:32
示例 5:
输入:[[2,2,2],[2,1,2],[2,2,2]]
输出:46
提示:
1 <= N <= 50
0 <= grid[i][j] <= 50
解法:
/**
* @param {number[][]} grid
* @return {number}
*/
// 64ms 35.2mb
var surfaceArea = function(grid) {
let res = 0, len = grid.length
for(let i = 0; i < len; i++){
for(let j = 0; j < len; j++){
let eachNum = grid[i][j]
if(eachNum > 0){
res = res + 2 + 4*eachNum // 上下2个面积 + 4个面积 * 个数
// 计算四个面积所在位置重复的面积减去,重复的为两个位置最矮那个个数;以下按照平面图的方向
// 上
if(j+1 < len) res -= Math.min(eachNum, grid[i][j+1])
// 下
if(j-1 >= 0) res -= Math.min(eachNum, grid[i][j-1])
// 左
if(i-1 >= 0) res -= Math.min(eachNum, grid[i-1][j])
// 右
if(i+1 < len) res -= Math.min(eachNum, grid[i+1][j])
}
}
}
return res
};
复杂度分析
时间复杂度:O(N^2),其中 N 是 grid 中的行和列的数目。
空间复杂度:O(1)。