一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情。
今天已经是周三了,虽然明天要上线,但并不妨碍还有两天就放假
三维形体投影面积
该题出自力扣的883题 —— 三维形体投影面积【简单题】,虽然是简单题,但是空间思维着实是把我拿捏住了
审题
- 题意看着很麻烦,但是其实并没有太复杂,如果联想到高中时期的数学题,相信会比较好理解
- 首先题型给出一个二维数组,暂且放开二维数组,如图所示的xyz轴中,每一个格子都会有数个立方体垒上去
- 分别给出xy轴图和xz轴图和yz轴图,分别对应着顶部图、正面图和侧面图
- 题意就是要算出这三个图的面积总和
- 此时再回过头来看题目给出的二维数组,二维数组中给出的每一位数,都代表了xy轴所拥有的正方体个数,如[[1,2],[2,3]]第一个数则代表了x=0,y=0的格子存在1个立方体
- 解法:
- 首先顶部图的面积 等于 二维数组的个数的总和,前提是位值不等于0
- xz轴图的面积等于,二维数组中的每一个一维数组的最大值 * 1的总和
- yz轴的面积等于,二维数组中i坐标索引下的最大值,也就是 [[1,2],[3,4]]的i坐标是 1 和3的最大值
- 利用变量记录顶部图
- 利用两个数组记录最大值,并且在最后再进行比较总和
- 时间复杂度O(n^2),因为需要遍历二维数组
- 空间复杂度O(n^2),其实也可以常量空间,但是为了直观,所以使用了数组
编码
class Solution {
public int projectionArea(int[][] grid) {
int top = 0;
int[] maxL = new int[grid[0].length];
int[] maxR = new int[grid.length];
for (int i = 0; i < grid.length; i++) {
int max = 0;
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] != 0){
top += 1;
}
maxL[j] = Math.max(maxL[j],grid[i][j]);
max = Math.max(max,grid[i][j]);
}
maxR[i] = max;
}
return top + Arrays.stream(maxL).sum() + Arrays.stream(maxR).sum();
}
}