python-leetcode-892. 三维形体的表面积

892. 三维形体的表面积 - 力扣(LeetCode)

可以按照以下步骤计算总表面积:

  1. 初始化总表面积:遍历整个 grid,对于每个 grid[i][j],如果 v > 0,则贡献 6 * v(每个立方体有 6 个面)。

  2. 计算重叠部分

    • 同一列中,相邻单元格 (i, j)(i+1, j) 之间会粘住 min(grid[i][j], grid[i+1][j]) 个面。

    • 同一行中,相邻单元格 (i, j)(i, j+1) 之间会粘住 min(grid[i][j], grid[i][j+1]) 个面。

  3. 最终计算:总表面积 = 初始面积 - 粘连减少的面积。

代码实现:

def surfaceArea(grid):
    n = len(grid)
    area = 0

    for i in range(n):
        for j in range(n):
            if grid[i][j] > 0:
                # 计算该单元格的总表面积
                area += 6 * grid[i][j] - 2 * (grid[i][j] - 1)

            # 减去与上方单元格的粘连部分
            if i > 0:
                area -= 2 * min(grid[i][j], grid[i-1][j])

            # 减去与左侧单元格的粘连部分
            if j > 0:
                area -= 2 * min(grid[i][j], grid[i][j-1])

    return area

复杂度分析:

  • 遍历整个 grid,时间复杂度为 O(n^2)。

  • 额外只使用了常数级别的空间,空间复杂度为 O(1)。

例子:

输入:
grid = [[1,2],[3,4]]
计算:
  • 初始表面积:1*6 + 2*10 + 3*14 + 4*18 = 6 + 10 + 14 + 18 = 48

  • 减去粘连部分:

    • 上下相邻 (1,0)(0,0) 贡献 2*min(3,1) = 2

    • 上下相邻 (1,1)(0,1) 贡献 2*min(4,2) = 4

    • 左右相邻 (0,1)(0,0) 贡献 2*min(2,1) = 2

    • 左右相邻 (1,1)(1,0) 贡献 2*min(4,3) = 6

  • 总面积 48 - (2 + 4 + 2 + 6) = 34

输出:
print(surfaceArea(grid))  # 34

这个方法高效地计算了最终的表面积,确保所有的粘连部分都正确扣除。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值