在n * n
的網格上,我們放置一些1 * 1 * 1
的立方體。
每個值v = grid[i][j]
表示v
個正方體疊放在單元格(i, j)
上。
返回結果形體的總表面積。
示例 1:
示例 2:輸入:[[2]]
輸出:10
示例 3:輸入:[[1,2],[3,4]]
輸出:34
示例 4:輸入:[[1,0],[0,2]]
輸出:16
示例 5:輸入:[[1,1,1],[1,0,1],[1,1,1]]
輸出:32
輸入:[[2,2,2],[2,1,2],[2,2,2]]
輸出:46
解析:我這個題一開始做的有問題,但是通過了也懶得改了,我用的是最傻的方法,頂面積和底面積和就是xy面的投影,就是非零元素個數*2,側面積:找出grid陣列中最大值maxn,把所有方塊進行分層,從0-maxn-1;這樣每一層就是乙個二維陣列0個或者1個,然後從0,0點開始遍歷,如果當前遍歷的節點值為1,sum+4,同時如果(以00為左下)左邊節點也是1,就-2,如果下面節點也有方塊,即也是1,就再-2,如此遍歷所有節點得到這一層的側面積,遍歷所有層。想著50*50*50也沒有多大,不知道為啥就跑到接近兩秒,剛好通過;
第二種:真正的解法應該是,頂面積底面積一樣計算,側面積從0,0點開始遍歷(不分層),到任何乙個點,sum+4*節點個數-2*(min(左側方塊個數,當前方塊個數))-2(min(下側方塊個數,當前方塊個數));應該不難理解,就是疊積木,把重疊的面積減掉;
第二種解如下(執行時間72ms):
class solution
};
第一種解(執行時間1876ms):
class solution
for(int h=0;h> curlevel(grid.size(),vector(grid[0].size(),0));
for(int i=0;i0)
else
}sum+=levelcal(curlevel);
}sum+=2*x;
return sum;
}int levelcal(vector> curlevel)
};
LeetCode892 三維形體的表面積
題目描述 在 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...
LeetCode 892 三維形體的表面積
892.三維形體的表面積 在 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 輸出...
LeetCode 892 三維形體的表面積
表面積 頂面積 底面積 側面積 只要單元格內有正方體,它就貢獻出底面 表面 即v 0,等於表面積 2 側面積用v跟相鄰單元格的v比較,若v 相鄰單元格v2,則側面積 v v2,反之 0 單元格grid i j 的相鄰單元格為grid i 1 j grid i 1 j grid i j 1 grid ...