计算几何-892. 三维形体的表面积

2020-03-25 15:47:14

问题描述:

在 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

问题求解:

直接去运算每行每列的最大值,然后计算是不对的,因为可能会存在中间有空洞的情况,导致表面积计算减少。

正确的计算方式是每个柱体进行单独计算,并且逐行逐列的减去重复的部分。

时间复杂度:O(n ^ 2)

    public int surfaceArea(int[][] grid) {
        int res = 0;
        int n = grid.length;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] != 0) res += grid[i][j] * 4 + 2;
                if (i > 0) res -= Math.min(grid[i - 1][j], grid[i][j]) * 2;
                if (j > 0) res -= Math.min(grid[i][j - 1], grid[i][j]) * 2;
            }
        }
        return res;
    }

  

原文地址:https://www.cnblogs.com/hyserendipity/p/12566720.html