三维形体的表面积

此博客链接:https://www.cnblogs.com/ping2yingshi/p/12569009.html

三维形体的表面积(93min)

题目链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes/solution/liang-chong-si-lu-zuo-jia-fa-yu-zuo-jian-fa-by-net/

在 N * N 的网格上,我们放置一些 1 * 1 * 1  的立方体。

每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。

请你返回最终形体的表面积。

示例 1:

输入:[[2]]
输出:10
示例 2:

输入:[[1,2],[3,4]]
输出:34
示例 3:

输入:[[1,0],[0,2]]
输出:16
示例 4:

输入:[[1,1,1],[1,0,1],[1,1,1]]
输出:32
示例 5:

输入:[[2,2,2],[2,1,2],[2,2,2]]
输出:46

题解:

         题意:题目真是看了好长时间才看懂题目。题目给的数不是坐标位置,给的是坐标位置上的正方形的个数。

                   grid 是一个二维数组,grid[i]中描述了若干个高度不一的立方体,这些立方体由边长为1x1x1堆叠而成。

                   grid=[[2]]的意思是在x=0,y=0处的长方体由2个立方体堆叠而成,高度为2,表面积就是2*6-2=10

                   grid=[[1,2],[3,4]]意思是
                   在x=0,y=0处的长方体由1个立方体堆叠而成,高度为1,表面积就是1x6=6
                   在x=0,y=1处的长方体由2个立方体堆叠而成,高度为2,表面积就是2x6-2=10,合计总面积=10+6-2=14,要减掉重叠的面积,1x2=2。
                   在x=1,y=0处的长方体由3个立方体堆叠而成,高度为3,表面积就是3x6-2x2=14,合计总面积=10+6+14-2-4=24,要减掉重叠的面积,2x2=4。
                   在x=1,y=1处的长方体由4个立方体堆叠而成,高度为4,表面积就是4x6-2x3=18,合计总面积=18+10+6+14-2-4-2-6=34,要减掉重叠的面积,3x2=6,1x2=2。

                   为啥坐标是从(0,0),(0,1),(1,0),(1,1)开始的,我也不知道为啥。

        方法:总面积减去重合面积。

        思路:

                  计算一共有多少个正方形,每个正方形都有6个面,假设有N个正方形,一共有6*N个面,但是需要去掉重合的面,重合面积分两种情况:

                 1.当正方形和右边的正方形重合。

                 2.当正方形和下面的正方形重合。

                 注意:在计算重合面积时,需要判断当前正方形和右面和做下面那个正方形矮,重合面积只能重合到矮正方形。

                 每有正方形重合就会减少两个面,所以正方形表面积等于N*6-重合面积*2。

                说明:第一个(0,0)位置的正方形在N*N网格的左上角。

   代码:

class Solution {
    public int surfaceArea(int[][] grid) {
        int len=grid.length;
        int sum=0;//计算总正方形个数
        int face=0;//计算正方形重合面积
        for(int i=0;i<len;i++)
           for(int j=0;j<len;j++)
           {
               sum+=grid[i][j];
               if(grid[i][j]>0)
                  face+=grid[i][j]-1;
               if(i>0)//右面是i变,这里计算和右面重合的正方形
                  face+=Math.min(grid[i-1][j],grid[i][j]);
                if(j>0)//下面是j变,这里计算和下面重合的正方形
                  face+=Math.min(grid[i][j-1],grid[i][j]);
           }
        
        return sum*6-face*2;
    }
}
原文地址:https://www.cnblogs.com/ping2yingshi/p/12569009.html