三维形状的表面积来源:https://leetcode-cn.com/problems/surface-area-of-3d-shapes题目在N*N网格上,我们放置一些1*1*1立方体。每个值v=gridi表示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解题思路:做减法首先,理解题意。题目要求将立方体放置在N*N的格子中。先看题目给出的例1中输入的内容Input:[[2]]Output:10这里的意思是在一个1*1的网格中,垂直放置2个立方体。再看例子2:Input:[[1,2],[3,4]]Output:34你可能直接这样看,看不出什么意思。稍微改一下:[[1,2],[3,4]]在这里,在2*2的表格中,在相应的单元格中放置1、2、3和4个立方体。理解题意后,需要考虑在堆叠立方体时,可能会有重叠的部分。每当有重叠时,减去2个单位。如下图:重叠可以分为上图三种:垂直重叠,相对行重叠,相对列重叠对于垂直重叠,比较容易计算,只要在cube中的个数当前单元格大于1,则会有重叠部分,重叠部分的个数为立方体数减1。对于相对行重叠:因为单元格的立方体可能大于1,从行,立方体可能高也可能低(如果文字难以理解,可以考虑将立方体的重叠部分绘制并投影到平面上的二维)。可以得到,此时从行来看,重叠部分为相对列重叠的相邻两个单元格的值的最小值:这种情况类似于上面的“相对行”重叠”的情况,从列的角度来看,重叠的部分就是相邻两个单元格的值中的最小值。列出重叠的情况后,遍历的时候就可以计算这三种情况。上面说了,只要有重叠部分,就会减去2个单位。所以要计算两部分:所有立方体堆叠起来的表面积;每个重叠数量占用2个单位的表面积。具体实现如下。代码实现类Solution:defsurfaceArea(self,grid:List[List[int]])->int:#标题为N*N,这里默认行列为Nlength=len(grid)cube=0#三种重叠情况vertical_overlap=0row_overlap=0col_overlap=0foriinrange(length):forjinrange(length):#计算立方体个数cube+=grid[i][j]#考虑垂直重叠的情况ifgrid[i][j]>1:vertical_overlap+=(grid[i][j]-1)#考虑相对行重叠的情况ifj>0:row_overlap+=min(grid[i][j-1],grid[i][j])#考虑相对列重叠的情况ifi>0:col_overlap+=min(grid[i-1][j],grid[i][j])returncube*6-(vertical_overlap+row_overlap+col_overlap)*2实现结果以上是针对《三维形体的表面积》的问题。按照减法的思路,先列出可能重叠的情况,然后在最后的计算中减去重叠部分所消耗的单位面积,得到最终的解。欢迎关注微信公众号《书所集录》
