LeetCode-三维体的表面积

题目描述:

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

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

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

示例:

输入:[[2]]
输出:10
输入:[[1,2],[3,4]]
输出:34
输入:[[1,0],[0,2]]
输出:16
输入:[[1,1,1],[1,0,1],[1,1,1]]
输出:32
输入:[[2,2,2],[2,1,2],[2,2,2]]
输出:46

解题思路:

题都看不懂~(我最初看到题的想法)。解释一下示例中的输入表达的意思。

示例1:在坐标(0,0)的单元格中放2个立方体。

示例2:在坐标(0,0)的单元格中放1个立方体。坐标(0,1)的单元格中放2个立方体。坐标(1,0)的单元格中放3个立方体。坐标(1,1)的单元格中放4个立方体。

....

然后再来看这道题,其实这个题目的意思就是求出这些立方体除了被遮盖的部分之外的其他部分的表面积。还是以示例中的输入举例。

示例1:(0,0)中有2个立方体,把这两个立方体堆在一起(一个上面放上另一个),这就有两个面被遮挡,其他部分的表面积为(2*6 - 2*1  =>2个立方体,每个有6个面,被遮盖两个面,每个面1个平方)=10.

示例2:共有10个立方体,26个面被覆盖,其他部分的表面积为(10*6 - 26*1)=34。

....

看代码会理解的更彻底一点。同时一定要自己在纸上画画图。

代码:

class Solution:
def surfaceArea(self, grid: List[List[int]]) -> int:
if len(grid) == 0:
return 0
block = 0 # 统计共有多少个立方体
cover = 0 # 统计有多少个面被其他面盖住,在所有的立方体的表面积上减去被盖住的面数×2

for i in range(len(grid)):
for j in range(len(grid[i])):
if grid[i][j] > 0:
block += grid[i][j]
cover += grid[i][j] - 1
if i > 0:
cover += min(grid[i - 1][j], grid[i][j]) # 在同一行上,比较两个单元格中堆积的立方体数量,取小的那个
if j > 0:
cover += min(grid[i][j - 1], grid[i][j]) # 同理
return block * 6 - cover * 2

猜你喜欢

转载自www.cnblogs.com/RiverMap/p/12569358.html
今日推荐