892. 三维形体的表面积(技巧)

给你一个 n * n 的网格 grid ,上面放置着一些 1 x 1 x 1 的正方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。

放置好正方体后,任何直接相邻的正方体都会互相粘在一起,形成一些不规则的三维形体。

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

注意:每个形体的底面也需要计入表面积中。


在这里插入图片描述
输入:grid = [[1,2],[3,4]]
输出:34


在这里插入图片描述

输入:grid = [[1,1,1],[1,0,1],[1,1,1]]
输出:32


【思路】:
首先,一个柱体一个柱体的看,每个柱体是由:2 个底面(上表面/下表面)+ 所有的正方体都贡献了 4 个侧表面积。
然后,把柱体贴合在一起之后,我们需要把贴合的表面积给减掉,两个柱体贴合的表面积就是 两个柱体高的最小值*2。

作者:sweetiee
链接:https://leetcode.cn/problems/surface-area-of-3d-shapes/solution/shi-li-you-tu-you-zhen-xiang-jiang-jie-yi-kan-jiu-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【代码】:
这里代码写的非常巧妙,遍历过程中,每个柱体只需要减去左边和上边重复的面积。至于下边和右边的面积,由后面的柱体来减。

/**
 * @param {number[][]} grid
 * @return {number}
 */
var surfaceArea = function(grid) {
    let n = grid.length, area = 0;
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) { 
            let level = grid[i][j];
            if (level > 0) {
                // 一个柱体中:2个底面 + 所有的正方体都贡献了4个侧表面积 
                area += (level * 4) + 2;
                // 减掉 i 与 i-1 相贴的两份表面积
                area -= i > 0? Math.min(level, grid[i - 1][j]) * 2: 0; 
                // 减掉 j 与 j-1 相贴的两份表面积
                area -= j > 0? Math.min(level, grid[i][j - 1]) * 2: 0; 
            }  
        }
    }
    return area; 
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值