文章目录
题目
在 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
题解
题目本身从描述看理解不太容易,我也是看了10几遍才理解,简单解释下:
示例一:[[2]]
表示在二维平面上,坐标为(0,0)的位置上,有一个高度为2的立方体
示例 2:[[1,2],[3,4]]
以左下角为原点(0,0),不同位置表示立方体高度,立方体的排列方式如下:
3 4
1 2
示例 3:[[1,0],[0,2]]
立方体的排列方式如下:
0 2
1 0
示例 4:[[1,1,1],[1,0,1],[1,1,1]]
立方体的排列方式如下:
1 1 1
1 0 1
1 1 1
示例 5:[[2,2,2],[2,1,2],[2,2,2]]
立方体的排列方式如下:
2 2 2
2 1 2
2 2 2
解法一(按立方体加)
思路:对每个坐标位置的立方体,对6个面暴露的部分累加求和,分别站在每个面前面,从前到后进行求解,当然从算法层面可以对程序进行优化,但为了代码可读性依然保留了写作初始思路。
- 只要有立方体(值大于0),则上下两个面的值都会暴露
- 对于第一排的立方体,暴露的面等于立方体高度(值大小)
- 对于后排的立方体,暴露的面等于高出前面立方体的高度(后面值减去当前值)
- 时间复杂度:O(M*N)
- 空间复杂度:O(1)
# author: suoxd123@126.com
class Solution:
def surfaceArea(self, grid: List[List[int]]) -> int:
cnt, m,n = 0, len(grid),len(grid[0])
for i in range(0,m):
for j in range(0,n):
# 上下面
if grid[i][j] > 0:
cnt += 2
# 前面
if i == 0: # 第一排
cnt += grid[i][j]
elif grid[i]