LeetCode小算法记录(三十五)三维形体的表面积

在 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package leetCodeTest;

public class 三维形体的表面积 {
    public static void main(String[] args) {
        int[][] grid = new int[][]{{1,0},{0,2}};
        int i = surfaceArea(grid);
        System.out.println("i = " + i);
    }
    /**
     * 首先计算出当前柱体的总面积(不考虑与周围柱体之间的重叠),
     * 然后以当前柱体为中心计算右侧与上侧的重叠面积,使用总面积减去此面积,
     * 按照这种方式遍历NxN网格的所有位置。由于遍历时从最左上角开始,
     * 所以最终计算的重叠面积是包含所有柱体的重叠面积(即不会重复计算两次同一处的重叠)。
     * 按这种思路计算最终得到的结果即为最终面积。
     * @param grid
     * @return
     */
    public static int surfaceArea(int[][] grid) {
        int i,j;
        int count=0;
        for (i=0;i<grid.length;i++){
            for (j=0;j<grid[i].length;j++){
                if (grid[i][j] != 0){
                    count += (grid[i][j]-1)*4 + 6;
                    int res = find(i, j, grid);
                    count -= res;
                }
            }
        }
        return count;
    }
    public static int find(int i,int j,int[][] grid){
        if (grid[i][j] == 0)
            return 0;
        int count = 0;
        if (i-1 >=0 && grid[i-1][j] != 0)
            count += Math.min(grid[i][j], grid[i-1][j])*2;
        if (j - 1 >= 0 && grid[i][j-1] != 0)
            count += Math.min(grid[i][j],grid[i][j-1])*2;
        return count;
    }
}
发布了124 篇原创文章 · 获赞 13 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_31404603/article/details/105094199
今日推荐