883. 三维形体投影面积
题目来源:883. 三维形体投影面积
2022.04.25 每日一题
LeetCode 题解持续更新中GitHub仓库地址 CSDN博客地址
今天的题目依旧比较简单,哈哈哈,今天是要求解三视图的面积问题,那么我们可以这么进行分析:
如何才能有影子呢?
- 对于 俯视图来说,只要当前位置有 正方体,那么那就是有影子的,我们可以创建一个变量 bottom 来进行统计
- 对于正视图以及左视图,我们可以把看到的图像划分成为一条一条的。只要找到相应的条的最高的一个点,那么这个的高度就是这个条的面积(因为默认一个正方体的边长为 1 ;
1*高度
得到的值即为这一条的面积)
现在我们知道如何继续求解了,我们从题目里面知道,我们的这个数组 grid
是一个正方形, 因此他的长和宽是相等的,那么我们可以利用grid[i][j] 和 grid[j][i]
,来同时遍历两个方向。
同时,由于俯视图,我们也可以进行拆分,我们知道,有多少个 格子的高度不为 0
,就说明他有一个 俯视的面积需要加入到结果中,那么我们可以省略掉 bottom 变量,直接将 res 变量加一即可得到最终的结果。
class Solution {
public:
int projectionArea(vector<vector<int>>& grid) {
// 创建两个变量,分别记录两个方向的数组的最大值
int xMax = 0, yMax = 0;
// 创建一个结果变量,用于返回最后的结果
int res = 0;
// 取得数组的长度
int n = grid.size();
// 遍历数组
for (int i = 0; i < n; i++) {
// 将 两个方向的最大值每次置零
xMax = 0;
yMax = 0;
// 依次遍历数组
for (int j = 0; j < n; j++) {
// 如果发现了当前的位置有 正方体,就就在 res 的基础上 +1 就是俯视图的面积
if (grid[i][j] != 0) res++;
// 因为数组是正方形的,所以我们可以交换 i 与 j 分别向两个方向进行查找
xMax = max(xMax, grid[i][j]);
yMax = max(yMax, grid[j][i]);
}
// res 加上 两个方向的最大值
res += xMax + yMax;
}
// 最终返回最大值
return res;
}
};
class Solution {
public int projectionArea(int[][] grid) {
// 创建两个变量,分别记录两个方向的数组的最大值
int xMax = 0, yMax = 0;
// 创建一个结果变量,用于返回最后的结果
int res = 0;
// 取得数组的长度
int n = grid.length;
// 遍历数组
for (int i = 0; i < n; i++) {
// 将 两个方向的最大值每次置零
xMax = 0;
yMax = 0;
// 依次遍历数组
for (int j = 0; j < n; j++) {
// 如果发现了当前的位置有 正方体,就就在 res 的基础上 +1 就是俯视图的面积
if (grid[i][j] != 0) res++;
// 因为数组是正方形的,所以我们可以交换 i 与 j 分别向两个方向进行查找
xMax = Math.max(xMax, grid[i][j]);
yMax = Math.max(yMax, grid[j][i]);
}
// res 加上 两个方向的最大值
res += xMax + yMax;
}
// 最终返回最大值
return res;
}
}