LeetCode:892. Surface Area of 3D Shapes - Python

问题描述:

892. 三维形体的表面积

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

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

返回结果形体的总表面积。

示例 1:

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

提示:

  • 1 <= N <= 50
  • 0 <= grid[i][j] <= 50

问题分析:

这个题目就是,求个物体的表面积,和之前那个投影的题目很像。方法比较简单:
(1)上下面积一定相同,不为0,就可以。
(2)四个方向的面积,但从一列来看,只要找到这一列的最大值就是这一列的面了。
(3)从整体上讲,可以单独拿出这一个位置,和四周的位置相比较,这个位置的存在为整个表面增加了多少?例如,这个位置比周围的位置都高一个格,那就是说,这个的位置,为表面积增加了 4 ,如果小于,就是没有增加。

Python3实现:

class Solution:
    def surfaceArea(self, grid):
        n, res = len(grid), 0
        for r in range(n):  # 行
            for c in range(n):  # 列
                if grid[r][c]:
                    res += 2  # 上下 面积
                    for nr, nc in ((r-1, c), (r+1, c), (r, c-1), (r, c+1)):  # 四周的位置
                        if 0 <= nr < n and 0 <= nc < n:
                            round = grid[nr][nc]  # 获取周围的高度
                        else:
                            round = 0  # 出界为 0
                        res += max(grid[r][c] - round, 0)  # 至少为0
        return res


if __name__ == '__main__':
    grid = [[2, 2, 2], [2, 1, 2], [2, 2, 2]]
    solu = Solution()
    print(solu.surfaceArea(grid))

参考链接:官方解答和讨论区
声明: 总结学习,有问题可以批评指正,大神可以略过哦。

猜你喜欢

转载自blog.csdn.net/XX_123_1_RJ/article/details/82142756
今日推荐