问题描述:
在 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))
参考链接:官方解答和讨论区
声明: 总结学习,有问题可以批评指正,大神可以略过哦。