[LeetCode] 892、三維形體的表面積

題目描述

N * N 的網格上,我們放置一些 1 * 1 * 1 的立方體。每個值 v = grid[i][j] 表示 v 個正方體疊放在對應單元格 (i, j) 上。請你返回最終形體的表面積。

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

在這裏插入圖片描述

解題思路

關鍵是要先理解題意。首先,一個柱體一個柱體的看,每個柱體是由:2個底面(上表面/下表面)+ 所有的正方體都貢獻了4個側表面積。然後,把柱體貼合在一起之後,我們需要把貼合的表面積給減掉,兩個柱體貼合的表面積就是:兩個柱體高的最小值*2

參考代碼

class Solution {
public:
    int surfaceArea(vector<vector<int>>& grid) {
        int n = grid.size(), area = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                // 先把grid[i][j]賦值給level,省掉了bound check,可以略微略微略微優化一下耗時。。。
                int level = grid[i][j];
                if (level > 0) {
                    // 一個柱體中:2個底面 + 所有的正方體都貢獻了4個側表面積 
                    area += (level << 2) + 2;
                    // 減掉 i 與 i-1 相貼的兩份表面積
                    area -= i > 0? min(level, grid[i - 1][j]) << 1: 0; 
                    // 減掉 j 與 j-1 相貼的兩份表面積
                    area -= j > 0? min(level, grid[i][j - 1]) << 1: 0;
                }  
            }
        }
        return area;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章