算法小知识-----04.27-----三维形体投影面积

108 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情

今天已经是周三了,虽然明天要上线,但并不妨碍还有两天就放假

三维形体投影面积

该题出自力扣的883题 —— 三维形体投影面积【简单题】,虽然是简单题,但是空间思维着实是把我拿捏住了

审题

image.png

  • 题意看着很麻烦,但是其实并没有太复杂,如果联想到高中时期的数学题,相信会比较好理解
  • 首先题型给出一个二维数组,暂且放开二维数组,如图所示的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();
    }
}

image.png