leetcode892:三維形體的表面積

此題題目都看不懂,描述信息太少了。

關於題目的理解,可以參考此處:
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章