1.题目
在 n x n 的网格 grid 中,我们放置了一些与 x,y,z 三轴对齐的 1 x 1 x 1 立方体。
每个值 v = grid[i][j] 表示 v 个正方体叠放在单元格 (i, j) 上。
现在,我们查看这些立方体在 xy 、yz 和 zx 平面上的投影。
投影 就像影子,将 三维 形体映射到一个 二维 平面上。从顶部、前面和侧面看立方体时,我们会看到“影子”。
返回 所有三个投影的总面积 。
2.示例
示例 1:
输入:[[1,2],[3,4]]
输出:17
解释:这里有该形体在三个轴对齐平面上的三个投影(“阴影部分”)。
示例 2:
输入:grid = [[2]] 输出:5
示例 3:
输入:[[1,0],[0,2]] 输出:8
提示:
n == grid.length == grid[i].length
1 <= n <= 50
0 <= grid[i][j] <= 50
3.思路
理解题目
首先要理解题目所描述的内容是什么,结合示例我做下简单的解释,自己已经理解题目说的什么意思可以直接去看代码。
题目说给你一个立体图形,让你求他的正视图,左视图,俯视图面积的和。
关于这个立体图形的组成,由一些边长是1的小正方体堆成,放在一个方形区域内。
正方形区域是由一个二维数组组成的,这个二维数组的行数和列数一样,二维数组有几个数字,就有几个位置可以放小正方形,所以小正方形放的范围一定在一个大正方形的范围里。当然小正方形上面可以摞上更多的小正方形。
每一个数组中的数字的位置上放的小正方形的数量=这个数字
示例1的图很清楚,
示例2的意思是在一个1*1的数组上放2个小正方形,正视图2+左视图2+俯视图1=5
示例三的意思是在(0,0)放1个,在(2,2)放两个,正视图3+左视图3+俯视图2=8
解题思路
对于正视图和左视图,算面积都该用每一列的最大高度去算。
用双重for循环遍历数组,统计出左视图和正视图的每一列最高是多少,每一列的面积相加,最后加上俯视图面积即可。
俯视图最简单,数组的哪个位置放了方块,不管几个都只能看到一个,所以有几个数字不为0,俯视图的面积就是几。
求左视图的和正视图的请自行结合代码理解
4.代码
func projectionArea(grid [][]int) int {
//总面积
var area int
//左视图一列的最大高度
var maxLeft int
//正视图每一列的最大高度
var maxFront []int
//遍历二维数组
for k1, v1 := range grid{
for k2, v2 := range v1{
if grid[k1][k2] > maxLeft {
maxLeft = v2
}
//找到正视图每一列的最大高度
if k1 == 0 {
maxFront = append(maxFront, v2)
}
if grid[k1][k2] > maxFront[k2] {
maxFront[k2] = grid[k1][k2]
}
//加上俯视图面积
if v2 != 0 {
area = area + 1 * 1
log.Println("附视图面积+1")
}
}
//加上左视图面积
area = area + maxLeft * 1
log.Printf("左视图面积+%v", maxLeft)
maxLeft = 0
}
//加上正视图面积
for _, h := range maxFront {
area = area + h * 1
log.Printf("正视图面积+%v", h)
}
return area
}