【LeetCode每日一題】三維形體的表面積

在 N * N 的網格上,我們放置一些 1 * 1 * 1 的立方體。

每個值 v = grid[i][j] 表示 v 個正方體疊放在對應單元格 (i, j) 上。

請你返回最終形體的表面積。

示例 1:

輸入:[[2]]
輸出:10
示例 2:

輸入:[[1,2],[3,4]]
輸出:34
示例 3:

輸入:[[1,0],[0,2]]
輸出:16
示例 4:

輸入:[[1,1,1],[1,0,1],[1,1,1]]
輸出:32
示例 5:

輸入:[[2,2,2],[2,1,2],[2,2,2]]
輸出:46

提示:

1 <= N <= 50
0 <= grid[i][j] <= 50

來源:力扣(LeetCode)

C++1

解題思路:
此題題意不容易理解,但是觀察示例可以輔助理解題意:
首先立方體的任意一個面的面積爲1。給定一個二維數組grid,每個元素代表該位置上的正方體數量,每兩個相鄰的正方體之間會有面的重疊,是不計入表面積的,但是最底層的正方體的下表面是表面積的一部分,求最後擺出的整體形體的表面積。

主要的難點就是如何計算某個正方體和上下左右的正方體的重疊面積,將其減掉,注意不要重複計算。

解決辦法:從左上角遍歷二維數組,每個位置堆疊的正方體的個數乘以4代表4個側面的表面積總數,再加上最上面和最底層的面的面積2即可算出當前位置的總表面積res,在分別和左邊和上邊的位置堆疊的立方體做高度的比較,分別取最小高度h1,h2,則它們分別乘以2就是每個方向需要減去的表面積的數量,最後累計求出表面積的和即可。

class Solution {
public:
    int surfaceArea(vector<vector<int>>& grid) {
        int s = grid.size(),res=0;
        for(int i=0;i<s;i++){
            for(int j=0;j<s;j++){
                int value = grid[i][j];
                if(value>0){
                    res+=value*4+2;
                    if(i>0)
                        res-=min(value, grid[i-1][j])*2;
                    if(j>0)
                        res-=min(value, grid[i][j-1])*2;
                }
            }
        }
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章