python求球的表面积_892. 三维形体的表面积(Python)
題目
難度:★★☆☆☆
類型:幾何、數學、二維數組
在 N * N 的網格上,我們放置一些 1 * 1 * 1 的立方體。
每個值 v = grid[i][j] 表示 v 個正方體疊放在單元格 (i, j) 上。
返回最終形體的表面積。
提示
1 <= N <= 50
0 <= grid[i][j] <= 50
示例
示例 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
解答
這道題與【題目463. 島嶼的周長】屬于同一類,相當于將二維擴展到了三維。
循環。由于題目已經告知我們,搜索范圍是50*50的方格(grid),因此我們可以遍歷每一個方格,查看這些方格上是否存在四棱柱。
表面積的處理。這是這個問題的重點和難點,當某一個正方形(grid[i][j])上存在四棱柱時,四棱柱的上下底面是無法被遮擋的,因此最終結果一定包含上下底面,可能被遮擋的部分只有四個方向的側面,如果側面相鄰位置存在棱柱,那么當前棱柱肯定會有一部分表面被遮擋起來,且遮擋的面積取決于兩者的高度。
我們計算當前棱柱grid[i][j]貢獻的表面積:
底面:首先將兩個底面的面積加入結果中:ans=ans+2;
側面:四個相鄰位置(i+1, j), (i-1, j), (i, j+1), (i, j-1)分別考慮,如果其中一個位置存在高度為h的棱柱,那么當前高為grid[i][j]的棱柱被遮擋的部分高度為min(h, grid[i][j]),貢獻了grid[i][j]-min(h, grid[i][j])=max(0, grid[i][j]-h)的表面積,其中h既是相鄰棱柱的高度,也可以認為是兩者接觸面的面積,我們定義為concat。
例如[[1,5]],表示[0, 0]方格上放一個高度為1的棱柱A,[0, 1]方格上放一個高度為5的棱柱B,棱柱B貢獻的表面積的計算方式為:2(兩個底面)+3*5(三個沒有棱柱相鄰的側面)+(5-1)(與棱柱A接壤的側面)=21。
邊界。如果某一個棱柱已經在邊界上,我們考察其周圍四個相鄰方向時,可能發現一個方向上已經超出棋盤范圍,我們認為這個超出棋盤的位置上沒有棱柱,也就是該相鄰位置與當前接觸面的面積concat為零,這個面貢獻的表面積實際上就是當前棱柱的高度。
例如上述案例中,棱柱A貢獻的表面積是:2(兩個底面)+1(在邊緣的側面)+1(在邊緣的側面)+1(沒有棱柱接壤的側面)+0(與棱柱B接壤的側面)=5,兩個棱柱一共貢獻表面積21+5=26。
編碼過程如下:
class Solution:
def surfaceArea(self, grid):
"""
:param grid: List[List[int]]
:return: int
"""
N = len(grid)
ans = 0 # 總面積
for r in range(N):
for c in range(N):
if grid[r][c]: # 如果當前位置有柱體
ans += 2 # 上下底面
for nr, nc in ((r-1, c), (r+1, c), (r, c-1), (r, c+1)): # 考察四方
contact = grid[nr][nc] if 0 <= nr < N and 0 <= nc < N else 0 # 接觸面
ans += max(grid[r][c] - contact, 0) # 減去接觸面
return ans
如有疑問或建議,歡迎評論區留言~
總結
以上是生活随笔為你收集整理的python求球的表面积_892. 三维形体的表面积(Python)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何表示数组所有数都不等于一个数_每日算
- 下一篇: python企业级框架_Python六大