返回介绍

solution / 0800-0899 / 0892.Surface Area of 3D Shapes / README

发布于 2024-06-17 01:03:33 字数 3597 浏览 0 评论 0 收藏 0

892. 三维形体的表面积

English Version

题目描述

给你一个 n * n 的网格 grid ,上面放置着一些 1 x 1 x 1 的正方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。

放置好正方体后,任何直接相邻的正方体都会互相粘在一起,形成一些不规则的三维形体。

请你返回最终这些形体的总表面积。

注意:每个形体的底面也需要计入表面积中。

 

    示例 1:

    输入:grid = [[1,2],[3,4]]
    输出:34
    

    示例 2:

    输入:grid = [[1,1,1],[1,0,1],[1,1,1]]
    输出:32
    

    示例 3:

    输入:grid = [[2,2,2],[2,1,2],[2,2,2]]
    输出:46
    

     

    提示:

    • n == grid.length
    • n == grid[i].length
    • 1 <= n <= 50
    • 0 <= grid[i][j] <= 50

    解法

    方法一:遍历,逐个累加

    时间复杂度 $O(n^2)$,空间复杂度 $O(1)$。

    class Solution:
      def surfaceArea(self, grid: List[List[int]]) -> int:
        ans = 0
        for i, row in enumerate(grid):
          for j, v in enumerate(row):
            if v:
              ans += 2 + v * 4
              if i:
                ans -= min(v, grid[i - 1][j]) * 2
              if j:
                ans -= min(v, grid[i][j - 1]) * 2
        return ans
    
    class Solution {
      public int surfaceArea(int[][] grid) {
        int n = grid.length;
        int ans = 0;
        for (int i = 0; i < n; ++i) {
          for (int j = 0; j < n; ++j) {
            if (grid[i][j] > 0) {
              ans += 2 + grid[i][j] * 4;
              if (i > 0) {
                ans -= Math.min(grid[i][j], grid[i - 1][j]) * 2;
              }
              if (j > 0) {
                ans -= Math.min(grid[i][j], grid[i][j - 1]) * 2;
              }
            }
          }
        }
        return ans;
      }
    }
    
    class Solution {
    public:
      int surfaceArea(vector<vector<int>>& grid) {
        int n = grid.size();
        int ans = 0;
        for (int i = 0; i < n; ++i) {
          for (int j = 0; j < n; ++j) {
            if (grid[i][j]) {
              ans += 2 + grid[i][j] * 4;
              if (i) ans -= min(grid[i][j], grid[i - 1][j]) * 2;
              if (j) ans -= min(grid[i][j], grid[i][j - 1]) * 2;
            }
          }
        }
        return ans;
      }
    };
    
    func surfaceArea(grid [][]int) int {
      ans := 0
      for i, row := range grid {
        for j, v := range row {
          if v > 0 {
            ans += 2 + v*4
            if i > 0 {
              ans -= min(v, grid[i-1][j]) * 2
            }
            if j > 0 {
              ans -= min(v, grid[i][j-1]) * 2
            }
          }
        }
      }
      return ans
    }
    

    如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
    列表为空,暂无数据
      我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
      原文