三维形体的表面积
此博客链接:https://www.cnblogs.com/ping2yingshi/p/12569009.html
三维形体的表面积(93min)
在 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; } }