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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章