Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
892. 三维形体的表面积 - 力扣(LeetCode) (leetcode-cn.com)
给你一个 n * n 的网格 grid ,上面放置着一些 1 x 1 x 1 的正方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
放置好正方体后,任何直接相邻的正方体都会互相粘在一起,形成一些不规则的三维形体。
请你返回最终这些形体的总表面积。
注意:每个形体的底面也需要计入表面积中。
示例 1:
输入:grid = [[1,2],[3,4]]
输出:34
示例 2:
输入:grid = [[1,1,1],[1,0,1],[1,1,1]]
输出:32
示例 3:
输入:grid = [[2,2,2],[2,1,2],[2,2,2]]
输出:46
提示:
- n == grid.length
- n == grid[i].length
- 1 <= n <= 50
- 0 <= grid[i][j] <= 50
二、思路分析:
计算单个柱体贡献的表面积:
立方体个数为0时,贡献面积为0;
立方体个数大于0时,顶和底贡献两个面,根据四个侧面在前后左右四个方向上的重合计算侧面贡献面积:
当v > nv, 则贡献值为v-nv;
当v<= nv,则贡献值为0;
故贡献值为Math.max(v-nv, 0);
计算四个面的贡献值再加上顶和底贡献值即可得到单个柱体的贡献值,将所有贡献值累加可得总的贡献面积。
三、AC 代码:
/**
* @param {number[][]} grid
* @return {number}
*/
var surfaceArea = function(grid) {
let total = 0;
let n = grid.length;
for (let i = 0; i<n; i++) {
let nn = grid[i].length;
for (let j = 0; j < nn; j++) {
let v = grid[i][j],
left = i-1 >= 0 ? grid[i-1][j] : 0,
down = i+1 < n ? grid[i+1][j] : 0,
right = j+1 < nn ? grid[i][j+1] : 0,
up = j -1 >= 0 ? grid[i][j-1] : 0;
let current = 0;
if (v > 0) {
current += 2;
current += Math.max(v-left, 0);
current += Math.max(v-right, 0);
current += Math.max(v-down, 0);
current += Math.max(v-up, 0);
}
total += current;
}
}
return total;
};