美文网首页
立方体表面积

立方体表面积

作者: 环宇飞杨 | 来源:发表于2020-03-25 23:19 被阅读0次

    题目

    在 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. 立方体的总表面积等于4n + 2;因为上下都有重合的地方所以还需要减掉重复面积,至于为什么是4n + 2,纸上画一下就好。
    2. 从左到右,减去和右侧相邻柱子重合的面积(左侧为原点不需要减,或者已经被上一个柱子减掉了,无需再算)
      重合的面积等于矮的那一边的高度 * 1* 2(两面)。
    3. 从下到上,减去和上方相邻的柱子重合面积(下方为原点也不需要减,或者已经被减掉,同上)
      重合的面积也同上,也是两面。
    4. 最终返回结果。

    代码

    class Solution {
        public int surfaceArea(int[][] grid) {
            int res = 0;
            for (int i = 0; i < grid.length; i++){
                for (int j = 0; j < grid[i].length; j++){
                    int v = grid[i][j];
                    if (v > 0){
                        res += (4*v)+2;
                        //减去右侧重合高度
                        if (i+1 < grid.length){ //右侧有柱子才需要减面积
                            int right = grid[i+1][j];//右侧柱子高度
                            if (right>v){
                                res -= v*2;
                            }else{
                                res -= right*2;
                            }
                        }
    
                        //减去顶部重合高度 
                        if (j+1 < grid[i].length){ //上方有柱子才需要减面积
                            int top = grid[i][j+1];//上方柱子高度
                            if (top > v){
                                res -= v*2;
                            }else{
                                res -= top*2;
                            }
                        }
                    }
                }
            }
            return res;
        }
    }
    

    相关文章

      网友评论

          本文标题:立方体表面积

          本文链接:https://www.haomeiwen.com/subject/sibfuhtx.html