初看这道题,棘手的地方在于两个立方体拼起来,会有两个面粘在一起,导致最后表面积减少1
同样的多个立方体,也会有多个面粘在一起
规律题
我们首先看多个立方体叠在一起的规律
一个立方体面积为6
两个立方体面积为6+6减去看不见的面(黏在一起的面)2 =》 6+6-2=10
两个立方体的面积为12-2=10
三个立方体的面积为18-4=12
四个立方体的面积为24-6=18
五个立方体的面积为30-8=22
六个立方体的面积为36-10=26
规律明显了
n个立方体的面积为n6-2(n-1)
我们再看左右衔接的立方体的面积
对每个堆叠的立方体,依次检查它四周衔接的立方体,减去它们之间的较小高度
例如,两个立方体和三个立方体衔接在一起,则两个立方体有两个面黏在一起,三个立方体也是有两个面黏在一起
重复上述操作,即可得到最后的总面积
class Solution:
def surfaceArea(self, grid: List[List[int]]) -> int:
ans=0
d=[[0,-1],[-1,0],[0,1],[1,0]]
def judge(i,j):
if i>=0 and j>=0 and i<len(grid) and j<len(grid[i]) and grid[i][j]:
return True
return False
for i in range(len(grid)):
for j in range(len(grid[i])):
if grid[i][j]==0:
continue
n=grid[i][j]
ans+=6*n-2*(n-1)
for ti,tj in d:
if judge(i+ti,j+tj):
ans-=min(grid[i][j],grid[i+ti][j+tj])
return ans
写得有点丑陋
更精简的代码
class Solution:
def surfaceArea(self, grid: List[List[int]]) -> int:
ans=0
for i in range(len(grid)):
for j in range(len(grid[i])):
if grid[i][j]==0:
continue
n=grid[i][j]
ans+=6*n-2*(n-1)
for ti,tj in ((i,j-1),(i-1,j),(i,j+1),(i+1,j)):
if ti>=0 and tj>=0 and ti<len(grid) and tj<len(grid[0]) and grid[ti][tj]:
ans-=min(grid[i][j],grid[ti][tj])
return ans