-
题目:在
n x n
的网格grid
中,我们放置了一些与x
,y
,z
三轴对齐的1 x 1 x 1
立方体。每个值v = grid[i][j]
表示v
个正方体叠放在单元格(i, j)
上。现在,我们查看这些立方体在xy
、yz
和zx
平面上的投影。投影 就像影子,将 三维 形体映射到一个 二维 平面上。从顶部、前面和侧面看立方体时,我们会看到“影子”。返回 所有三个投影的总面积 。1 -
实例:
# 示例一
输入:[[1,2],[3,4]]
输出:17
解释:这里有该形体在三个轴对齐平面上的三个投影(“阴影部分”)。
# 示例二
输入:grid = [[2]]
输出:5
# 示例三
输入:[[1,0],[0,2]]
输出:8
- 提示:
n == grid.length == grid[i].length
1 <= n <= 50
0 <= grid[i][j] <= 50
- 思路:
定义x,y,z,index为0
计算x,x就是从图像的上方看,若有图像则加1
计算y,y是从正面看,计算每行图像最高的那个即值最大的那个之和就是y
计算z,z从侧面看,计算侧面看最高的那个方块个数,每列最大的值之和就是z
返回x+y+z之和
- 解法一:
class Solution:
def projectionArea(self, grid: List[List[int]]) -> int:
x, y, z, index = 0, 0, 0, 0
for i in grid:
x_max = 0
for j in i:
if j != 0:
x += 1
if j > x_max:
x_max = j
y += x_max
while index < len(grid):
y_max = 0
for i in grid:
if i[index] > y_max:
y_max = i[index]
z += y_max
index += 1
return x + y + z
- 解法二–高级版本:
class Solution:
def projectionArea(self, grid) -> int:
xy = sum((len(_) - _.count(0) for _ in grid)) # 计算二维矩阵除去0的大小
xz = sum((max(_) for _ in grid))
zy = 0
for i in range(len(grid[0])): # 每一列中的最大求和
max_ = 0
for j in range(len(grid)):
max_ = max(grid[j][i], max_)
zy += max_
return xy + xz + zy
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/projection-area-of-3d-shapes ↩︎