此題題目都看不懂,描述信息太少了。
關於題目的理解,可以參考此處:
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;
}