3月打卡活动第25天 LeetCode第892题:三维形体的表面积(简单)

3月打卡活动第25天 LeetCode第892题:三维形体的表面积(简单)

  • 题目:在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。请你返回最终形体的表面积。
    在这里插入图片描述
  • 解题思路:表面积分成三部分计算,一是上下两个面,二是四周,三是高度差带来的表面积。算法有点麻烦了。。。
class Solution {
    public int surfaceArea(int[][] grid) {
        int L = grid.length;
        int W = grid[0].length;
        int area = 0;
        //只有一个位置
        if(L==1 && W==1) return grid[0][0]*4+2;
        //一排或一列
        if(L==1){
            for(int i=0;i<W;i++){
                if(grid[0][i]!=0) area += 2;
                if(i==0){
                    area += grid[0][i]*3;
                    area += Math.abs(grid[0][i]-grid[0][i+1]);
                }else if(i==W-1){
                    area += grid[0][i]*3;
                }else{
                    area += grid[0][i]*2;
                    area += Math.abs(grid[0][i]-grid[0][i+1]);
                }
            }
            return area;
        }
        if(W==1){
            for(int i=0;i<L;i++){
                if(grid[i][0]!=0) area += 2;
                if(i==0){
                    area += grid[i][0]*3;
                    area += Math.abs(grid[i][0]-grid[i+1][0]);
                }else if(i==L-1){
                    area += grid[i][0]*3;
                }else{
                    area += grid[i][0]*2;
                    area += Math.abs(grid[i][0]-grid[i+1][0]);
                }
            }
            return area;
        }
        //矩形
        for(int i=0;i<L;i++){
            for(int j=0;j<W;j++){
                if(grid[i][j]!=0) area += 2;
                if(i==0){
                    if(j==0){
                        area += grid[i][j]*2;
                        area += Math.abs(grid[i][j]-grid[i][j+1])
                        +Math.abs(grid[i][j]-grid[i+1][j]);
                    }else if(j==W-1){
                        area += grid[i][j]*2;
                        area += Math.abs(grid[i][j]-grid[i+1][j]);
                        
                    }else{
                        area += grid[i][j];
                        area += Math.abs(grid[i][j]-grid[i][j+1])
                        +Math.abs(grid[i][j]-grid[i+1][j]);
                    }
                }else if(i==L-1){
                    if(j==0){
                        area += grid[i][j]*2;
                        area += Math.abs(grid[i][j]-grid[i][j+1]);
                    }else if(j==W-1){
                        area += grid[i][j]*2;
                    }else{
                        area += grid[i][j];
                        area += Math.abs(grid[i][j]-grid[i][j+1]);
                    }
                }else{
                    if(j==0){
                        area += grid[i][j];
                        area += Math.abs(grid[i][j]-grid[i][j+1])
                        +Math.abs(grid[i][j]-grid[i+1][j]);
                    }else if(j==W-1){
                        area += grid[i][j];
                        area += Math.abs(grid[i][j]-grid[i+1][j]);
                    }else{
                        area += Math.abs(grid[i][j]-grid[i][j+1])
                        +Math.abs(grid[i][j]-grid[i+1][j]);
                    }
                }
            }
        }
        return area;
    }
}

在这里插入图片描述

  • 题解做法:算出所有的表面积再减去贴住的表面积。
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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

发布了111 篇原创文章 · 获赞 17 · 访问量 2913

猜你喜欢

转载自blog.csdn.net/new_whiter/article/details/105088200