leetcode 892. Surface Area of 3D Shapes 三维形体的表面积
leetcode 2020年3月 每日一题打卡
题目:
在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。请你返回最终形体的表面积。
示例 1:输入:[[2]] 输出:10
示例 2:输入:[[1,2],[3,4]] 输出:34
示例 3:输入:[[1,0],[0,2]] 输出:16
示例 4:输入:[[1,1,1],[1,0,1],[1,1,1]] 输出:32
示例 5:输入:[[2,2,2],[2,1,2],[2,2,2]] 输出:46
提示:
1 <= N <= 50
0 <= grid[i][j] <= 50
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes
思路:
- “哨兵”方法处理边界。
- 依次算每个格子露出的面积,每个格子的表面积与上下左右是否有立方体以及有几个有关。
- 时间复杂度O(N ^2)
细节:
- insert() 函数用于将指定对象插入列表的指定位置。list.insert(index, obj) 。index – 对象 obj 需要插入的索引位置。obj – 要插入列表中的对象。
代码:
class Solution(object):
def surfaceArea(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
# 总时间复杂度O(N^2)
# “哨兵”方法处理边界
n= len(grid)
tem=[0,0]
for i in range(n):
grid[i].insert(n,0)
grid[i].insert(0,0)
tem.append(0)
grid.insert(n,tem)
grid.insert(0,tem)
print(grid)
s=0
# 依次算每个格子露出的面积,每个格子的表面积与上下左右是否有立方体以及有几个有关
for i in range(1,n+1):
for j in range(1,n+1):
if grid[i][j]==0:
continue
s+=2 #顶底面积
s+=max(0,grid[i][j]-grid[i-1][j])
s+=max(0,grid[i][j]-grid[i+1][j])
s+=max(0,grid[i][j]-grid[i][j-1])
s+=max(0,grid[i][j]-grid[i][j+1])
return s
本博客为原创作品,欢迎指导,转载请说明出处,附上本文链接,谢谢!