在 N * N
的网格中,我们放置了一些与 x,y,z 三轴对齐的 1 * 1 * 1
立方体。
每个值 v = grid[i][j]
表示 v
个正方体叠放在单元格 (i, j)
上。
现在,我们查看这些立方体在 xy、yz 和 zx 平面上的投影。
投影就像影子,将三维形体映射到一个二维平面上。
在这里,从顶部、前面和侧面看立方体时,我们会看到“影子”。
返回所有三个投影的总面积。
示例 1:
输入:[[2]] 输出:5
示例 2:
输入:[[1,2],[3,4]] 输出:17 解释: 这里有该形体在三个轴对齐平面上的三个投影(“阴影部分”)。
示例 3:
输入:[[1,0],[0,2]] 输出:8
示例 4:
输入:[[1,1,1],[1,0,1],[1,1,1]] 输出:14
示例 5:
输入:[[2,2,2],[2,1,2],[2,2,2]] 输出:21
==============================================
解题思路
我们肯定要遍历二维数组,遍历一次需要完成3个任务:
1.俯视图面积,即不为0元素的个数
2.主视图面积,即每一列的最大值之和
3.侧视图面积,即每一行的最大值之和
循环之后三者相加即可
难点:我们可以在每层循环中找到当层循环的最大值然后累加,即每行的最大值,那每列的最大值如何求呢?
我当时没多考虑,使用的数组进行接收的,因此空间换时间前提下速度还可以
其实我们可以同时以行的形式和列的形式一起遍历,即 arr [ i ][ j ]和arr [ j ][ i ]
这样可以将使用的空间控制在常数范围内
好了。。。不管讲的清不清楚,贴上我的垃圾代码
class Solution {
public int projectionArea(int[][] grid) {
int x=0,y=0,z=0;
int[] recordx = new int[grid[0].length];
for (int i = 0; i < grid.length; i++) {
int recordy =0;
for (int j = 0; j < grid[i].length; j++) {
//z
if(grid[i][j]>0){
z++;
}
//x
recordx[j]=recordx[j]>grid[i][j]?recordx[j]:grid[i][j];
//y
recordy=recordy>grid[i][j]?recordy:grid[i][j];
}
y+=recordy;
}
for (int i = 0; i < recordx.length; i++) {
x+=recordx[i];
}
return x+y+z;
}
}