LeetCode | 0892. Surface Area of 3D Shapes三維形體的表面積【Python】

LeetCode 0892. Surface Area of 3D Shapes三維形體的表面積【Easy】【Python】【數學】

Problem

LeetCode

On a N * N grid, we place some 1 * 1 * 1cubes.

Each value v = grid[i][j] represents a tower of v cubes placed on top of grid cell (i, j).

Return the total surface area of the resulting shapes.

Example 1:

Input: [[2]]
Output: 10

Example 2:

Input: [[1,2],[3,4]]
Output: 34

Example 3:

Input: [[1,0],[0,2]]
Output: 16

Example 4:

Input: [[1,1,1],[1,0,1],[1,1,1]]
Output: 32

Example 5:

Input: [[2,2,2],[2,1,2],[2,2,2]]
Output: 46

Note:

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

問題

力扣

在 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

思路

數學

從反面來考慮,先計算有多少疊起來的面,最後減去疊起來面。

疊起來的 v 個立方體有 v-1 個接觸面,分兩種情況:
1. 當前柱子與上邊柱子接觸
2. 當前柱子與左邊柱子接觸

時間複雜度: O(n^2)
空間複雜度: O(1)

Python3代碼
class Solution:
    def surfaceArea(self, grid: List[List[int]]) -> int:
        n = len(grid)
        cubes, faces = 0, 0
        for i in range(n):
            for j in range(n):
                cubes += grid[i][j]
                if grid[i][j] > 0:
                    # 疊起來的 v 個立方體有 v-1 個接觸面
                    faces += grid[i][j] - 1
                if i > 0:
                    # 當前柱子與上邊柱子的接觸面數量
                    faces += min(grid[i-1][j], grid[i][j])
                if j > 0:
                    # 當前柱子與左邊柱子的接觸面數量
                    faces += min(grid[i][j-1], grid[i][j])
        return 6 * cubes - 2 * faces

GitHub鏈接

Python

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章