leetcode--883. 三维形体投影面积

  • 题目:在 n x n 的网格 grid 中,我们放置了一些与 xyz 三轴对齐的 1 x 1 x 1 立方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上。现在,我们查看这些立方体在 xyyz zx 平面上的投影。投影 就像影子,将 三维 形体映射到一个 二维 平面上。从顶部、前面和侧面看立方体时,我们会看到“影子”。返回 所有三个投影的总面积 。1

  • 实例:

# 示例一
输入:[[1,2],[3,4]]
输出:17
解释:这里有该形体在三个轴对齐平面上的三个投影(“阴影部分”)# 示例二
输入:grid = [[2]]
输出:5
# 示例三
输入:[[1,0],[0,2]]
输出:8
  • 提示:
  1. n == grid.length == grid[i].length
  2. 1 <= n <= 50
  3. 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

  1. 来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/projection-area-of-3d-shapes ↩︎

你可能感兴趣的:(leetcode,leetcode,算法,python)