对于Grid(i,j)设其值为val,则单独考虑当前元素,其贡献的表面积为4*val+2
但是,Gird(i,j)可能和其他元素挨着,当挨着时,对于接触的表面,要减去其表面积
对Grid(i,j)有上下左右四个方向可能有接触,但我们只需要考虑上和左两个方向,右和下放到后面的元素去考虑。
即对grid(i,j)首先计算增加的表面积4*val+2
然后计算与上方的接触面,减小的面积等于接触的面积*2
计算与下方的接触面,减小的面积等于接触的面积*2
代码如下:
class Solution {
public:
int surfaceArea(vector<vector<int>>& grid) {
int n=grid.size();
int area=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
int num=grid[i][j];
if(num>0)
{
area+=(num<<2)+2;//area+=4*num+2
area-=i>0?min(num,grid[i-1][j])<<1:0;//左边
area-=j>0?min(num,grid[i][j-1])<<1:0;//上边
}
}
return area;
}
};