第一次参加Leetcode周赛
三维形体投影面积
三维形体投影面积
在 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
开始没看懂题,然后看大佬们几分钟就写出来了….就仔细看了下,数组里的数代表的是立方体个数,i,j自动代表了位置,所以可以这样写:
- 计算相对于地面的立方体投影个数
- 计算相对与后面的立方体投影个数
- 计算相对于左面的立方体投影个数
1的话可以用一个计数器,遍历二维数组,不为0就自加
2的话可在遍历二维数组的同时,将一维数组中最大的值求出,然后求和
3的话另开一个for循环,先j后i,求最大和2类似
代码如下:
int projectionArea(vector<vector<int>>& grid) {
int sum = 0;
int x = 0;
for(int i=0;i<grid.size();i++){
int min = 0;
for(int j=0;j<grid[i].size();j++){
if(grid[i][j]!=0){
sum++;
}
if(grid[i][j]>min){
min = grid[i][j];
}
}
x +=min;
} //地面和左面
int y = 0;
for(int i=0;i<grid[0].size();i++){
int min = 0;
for(int j=0;j<grid.size();j++){
if(grid[j][i]>min){
min = grid[j][i];
}
}
y+=min; //后面
}
return x+y+sum;
}
emmm我的代码看起来好恶心,我再贴一下u神的,算了,贴另外一名大佬的看着真的舒服,最后,u神第一题罚时了哈哈哈
int projectionArea(vector<vector<int>>& a) {
int n=a.size(),m=a[0].size(),ans=0;
vector<int> x(n,0),y(m,0);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
if(a[i][j]>0)ans++;
x[i]=max(x[i],a[i][j]);
y[j]=max(y[j],a[i][j]);
}
for(int i=0;i<n;i++)ans+=x[i];
for(int i=0;i<m;i++)ans+=y[i];
return ans;
}