此题题目都看不懂,描述信息太少了。
关于题目的理解,可以参考此处:
https://leetcode-cn.com/problems/surface-area-of-3d-shapes/solution/shi-li-you-tu-you-zhen-xiang-jiang-jie-yi-kan-jiu-/
当你看懂之后,就可以开始做题了。
一开始想着使用三视图×2的方式来做,发现中间空部分始终想不到怎么做。
下面是三视图方式,中间挖空部分不会算。
int surfaceArea(vector<vector<int>>& grid) {
int num = grid.size();//先判断是几维的
int front=0,right=0,up=0;
//vector<int> cal;
int temp=0;
int temp2 = 0;
//中间空的怎么判断?
int center=0;
for(int i = 0 ; i < num; i++)
{
for(int j = 0 ; j < num; j++)
{
if(temp <= grid[j][i])
{
temp = grid[j][i];
}
if(j == num-1)
{
front += temp;
temp = 0;
}
if(temp2 <= grid[i][j]){
temp2 = grid[i][j];
}
if(j == num-1)
{
right+= temp2;
temp2 = 0;
}
if(grid[i][j] != 0)
{
up++;
}
}
}
return front*2+right*2+up*2;
}
于是就改用广度遍历搜索方法,做减法
1.循环遍历所有的格子
2.首先是当前格子堆叠情况,如果堆叠n个,则减(n-1)2个面;比如两个方块叠在一起,相比原来6×2,少了1×2个面,又如四个方块堆叠,相比原来64少了(4-1)*3个面。
3.然后搜索左边和上面是否有值,有的话就取当前值和左边(上边)较小的值,这个值是重叠数n,那么要相比原来的值减去重叠数n×2
图示:
代码:
int surfaceArea(vector<vector<int>>& grid) {
int n = grid[0].size();
int res=0;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
if(grid[i][j]) {
//两个方块叠在一起则少1×2个面
//n个方块叠在一起则少(n-1)×2个面
res += 6 * grid[i][j] - (grid[i][j]-1)*2;
//广度遍历搜索
//判断左边和上面的值,取最小的值作为重叠数
//比如当前值是5,左边值为3,则重叠为3,减去(重叠数n)*2
if(i > 0 && grid[i-1][j])
{
res -=2*min(grid[i-1][j],grid[i][j]);
}
if(j>0 && grid[i][j-1])
{
res -=2*min(grid[i][j-1],grid[i][j]);
}
}
}
return res;
}