883. 三维形体投影面积
题目描述
在
n x n
的网格 grid 中,我们放置了一些与 x,y,z 三轴对齐的 1 x 1 x 1 立方体。
每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上。
现在,我们查看这些立方体在 xy 、yz 和 zx 平面上的投影。
投影 就像影子,将 三维 形体映射到一个 二维 平面上。从顶部、前面和侧面看立方体时,我们会看到“影子”。
返回 所有三个投影的总面积 。
思路
正视图:每一行最大值之和;
侧视图:每一列最大值之和;
俯视图:柱子个数;
题解
func projectionArea(grid [][]int) int {
n := len(grid)
xoyProjectionArea, yozProjectionArea, xozProjectionArea := 0, 0, 0
for i := 0; i < n; i++ {
rowMax, colMax := math.MinInt64, math.MinInt64
for j := 0; j < n; j++ {
if len(grid)>i {
if len(grid[i])>j {
// 俯视图: 柱子数
if grid[i][j] != 0 {
xoyProjectionArea++
}
rowMax = max(rowMax, grid[i][j])
}
}
if len(grid)>j {
if len(grid[j])>i {
colMax = max(colMax, grid[j][i])
}
}
}
// 侧视图: 每一列的最大值之和
yozProjectionArea += rowMax
// 正视图: 每一行的最大值之和
xozProjectionArea += colMax
}
return xozProjectionArea + xoyProjectionArea + yozProjectionArea
}
func max(a, b int) int {
if a > b {
return a
}
return b
}