Leetcode-892. 三维形体的表面积

  • 题目:(简单)

在 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

  • 我的想法思路

表面积的话,想到的是三视图的面积然后乘以2。如何去求解三视图呢?

眉头一皱,发现不对劲!如果中间是挖空的话,三视图肯定是不行的!!!这个思路 (错)!

另辟蹊径!

发现每个立方体的表面积都是6,两个立方体时,可能是12也可能是10。为什么呢?因为连接部分导致减少了,每有一个连接面,则表面积减少2。所以如何去求解所有立方体的连接面呢?

从上到下,从左到右依次遍历,然后每次都只减去本身连接面,右方连接面,下方连接面。

class Solution {
    public int surfaceArea(int[][] grid) {
        int s = 0;
        int N = grid.length;
        //长宽+1,防止后面数组越界。
        int[][] grids = new int[N+1][N+1];
        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                grids[i][j] = grid[i][j];
            }
        }

        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++){
                int temp = grids[i][j] * 6;
                //减去竖直连接面
                if(grids[i][j] > 1){
                    temp -= (grids[i][j] - 1) * 2;
                }
                //减去右方连接面
                if(grids[i+1][j] != 0){
                    //左边高度 小于等于 右边高度,减去左边高度
                    if(grids[i][j] <= grids[i+1][j]){
                        temp -= grids[i][j] * 2;
                    }
                    //左边高度 大于 右边高度,减去右边高度
                    if(grids[i][j] > grids[i+1][j]){
                        temp -= grids[i+1][j] * 2;
                    }
                }
                //减去下方连接面
                if(grids[i][j] != 0){
                    //上方高度 小于等于 下方高度,减去上方高度
                    if(grids[i][j] <= grids[i][j+1]){
                        temp -= grids[i][j] * 2;
                    }else{
                        temp -= grids[i][j+1] * 2;
                    }
                }
                s += temp;
            }
        }
        
        return s;
    }
}

代码有点丑,哈哈哈哈,因为怕数组越界了,而且还不知道怎么增加长度,所以只好老老实实遍历赋值。又是吃了代码的亏!!!!在网上没找到怎么赋值。

  • 看看大佬
class Solution {
    public int surfaceArea(int[][] grid) {
        int n = grid.length, area = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                // 先把grid[i][j]赋值给level,省掉了bound check,可以略微略微略微优化一下耗时。。。
                int level = grid[i][j];
                if (level > 0) {
                    // 一个柱体中:2个底面 + 所有的正方体都贡献了4个侧表面积 
                    area += (level << 2) + 2;
                    // 减掉 i 与 i-1 相贴的两份表面积
                    area -= i > 0? Math.min(level, grid[i - 1][j]) << 1: 0; 
                    // 减掉 j 与 j-1 相贴的两份表面积
                    area -= j > 0? Math.min(level, grid[i][j - 1]) << 1: 0;
                }  
            }
        }
        return area;
    }
}

作者:sweetiee
链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes/solution/shi-li-you-tu-you-zhen-xiang-jiang-jie-yi-kan-jiu-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

想法是差不多的,但是这个代码好简洁,看完之后发现我的代码也可以优化了,不用遍历赋值给grids,只需要判断就可以了!!而且这个代码好看的不得了。可以用到min函数,就不用判断,位运算,而且三目运算符!!太美了。好好学习!

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值