leetcode 892. 三维形体的表面积

在 N * N 的网格上,我们放置一些 1 * 1 * 1  的立方体。

每个值v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。

请你返回最终形体的表面积。

 

题解:

1.N*N网格

2.1*1*1立方体

3.v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上

4.求表面积

 

示例 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

 

解题思路:

立方体放在一起的时候,相邻的立方体会掩盖2个单位的表面积。相邻包括:前后,左右,上下六个方向

  • 计算全部表面积,减去相邻掩盖掉的面

  • 减去上下方向,在(i,j)坐标上摞有v个立方体,被掩盖掉(v-1)*2个面

  • 减去前后方向,在j轴上减去相邻两摞立方体最少个数*2个面

  • 减去左右方向,在j轴上减去相邻两摞立方体最少个数*2个

C/C++题解:

class Solution {

public:

    int surfaceArea(vector<vector<int>>& grid) {

        int surfaceNum=0;//记录面数

        for (int i = 0; i < grid.size(); i++) {

            for (int j = 0; j < grid[i].size(); j++) {

                if (grid[i][j]!=0) {//遍历元素

                    surfaceNum+=grid[i][j]*6;//不考虑被遮盖的面总共有

                    surfaceNum-=(grid[i][j]-1)*2;}//减去上下方向遮盖的面*2

                if (i>0)//如果有左右相邻立方体,减去左右方向遮盖的

                    surfaceNum-=min(grid[i-1][j], grid[i][j])*2;

                if (j>0)//如果有前后相邻立方体,减去左右方向遮盖的

                    surfaceNum-=min(grid[i][j-1], grid[i][j])*2;}}

        return surfaceNum;}};//返回所有没有被遮盖的

Debug结果:

Java题解:

class Solution {

    public int surfaceArea(int[][] grid) {

        int surfaceNum=0;//记录面数

        for (int i = 0; i < grid.length; i++) {

            for (int j = 0; j < grid[i].length; j++) {

                if (grid[i][j]!=0) {//遍历元素

                    surfaceNum+=grid[i][j]*6;//不考虑被遮盖的面总共有

                    surfaceNum-=(grid[i][j]-1)*2;}//减去上下方向遮盖的面*2

                if (i>0)//如果有左右相邻立方体,减去左右方向遮盖的

                    surfaceNum-=Math.min(grid[i-1][j], grid[i][j])*2;

                if (j>0)//如果有前后相邻立方体,减去左右方向遮盖的

                    surfaceNum-=Math.min(grid[i][j-1], grid[i][j])*2;}}

        return surfaceNum; }}//返回所有没有被遮盖的

 

Debug结果:

Python题解:

class Solution(object):

    def surfaceArea(self, grid):

        """:type grid: List[List[int]]:rtype: int"""

 

        surfaceNum=0 #记录面数

        for i in range(len(grid)):

            for j in range(len(grid[i])):

                if grid[i][j] != 0:#遍历元素

                    surfaceNum += grid[i][j]*6#不考虑被遮盖的面总共有

                    surfaceNum-=(grid[i][j]-1)*2#减去上下方向遮盖的面*2

                if i>0:#如果有左右相邻立方体,减去左右方向遮盖的

                    surfaceNum-=min(grid[i-1][j], grid[i][j])*2

                if j>0:#如果有前后相邻立方体,减去左右方向遮盖的

                    surfaceNum-=min(grid[i][j-1], grid[i][j])*2

        return surfaceNum#返回所有没有被遮盖的

 

Debug结果:

例题来自力扣网https://leetcode-cn.com/

更多题解前往公众号获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值