问题描述
在 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
提示:
1 <= grid.length = grid[0].length <= 50
0 <= grid[i][j] <= 50
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/projection-area-of-3d-shapes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
执行结果
代码描述
思路:N*N的矩阵,如果vec[N][N]=0,则此位置没有放正方体。
扫描所有不为0的位置,总的个数,即为俯视图的面积。
扫描每一行,求每行的最大值,然后把所有行的最大值求和,即为左视图的面积。
扫描每一列,求每列的最大值,然后把左右列的最大值求和,即为主视图的面积。
class Solution {
public:
int projectionArea(vector<vector<int>>& grid) {
// 俯视图面积
int area_low = 0;
for(int i = 0; i < grid.size(); ++i)
{
for(int j = 0; j < grid[i].size(); ++j)
{
if(grid[i][j] != 0)
area_low += 1;
}
}
// 左视图面积
int area_left=0;
for(int i = 0; i < grid.size(); ++i)
{
area_left += Max(grid[i]);
}
// 主视图面积
int area_back = 0;
int back = 0;
for(int i = 0; i < grid.size(); ++i)
{
for(int j = 0; j < grid[i].size(); ++j)
{
back < grid[j][i] ? back = grid[j][i] : back;
}
area_back += back;
back = 0;
}
return area_low + area_back + area_left;
}
int Max(vector<int> vec)
{
int MAX = 0;
for(int i = 0; i < vec.size(); ++ i)
{
MAX < vec[i] ? MAX = vec[i] : MAX;
}
return MAX;
}
};
合并优化代码:
class Solution {
public:
int projectionArea(vector<vector<int>>& grid) {
int area_low = 0;
int area_left=0;
int left = 0;
int area_back = 0;
int back = 0;
for(int i = 0; i < grid.size(); ++i)
{
for(int j = 0; j < grid[i].size(); ++j)
{
if(grid[i][j] != 0) // 俯视图
area_low += 1;
left > grid[i][j] ? left : left = grid[i][j]; // 左视图
back > grid[j][i] ? back : back = grid[j][i]; // 主视图
}
area_left += left;
left = 0;
area_back += back;
back = 0;
}
return area_low + area_back + area_left;
}
};