欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode:892. 三维形体的表面积

程序员文章站 2024-03-15 11:31:17
...

892. 三维形体的表面积

题目:

LeetCode:892. 三维形体的表面积

解题思路:

我们先来理解一下题意:
LeetCode:892. 三维形体的表面积
[[1,2],[3,4]]就是一个二维数组A。A[i][j]表示每一个以单位正方形为底的空间上正方体的个数。
[[1,2],[3,4]]的意思就是假如我们把底面看作四个单位正方形,1、2、3、4就表示每个正方形上有正方体的个数。如下图,第一个正方形上有一个正方体;第二个正方形上有二个正方体;第三个正方形上有三个正方体;第四个正方形上有四个正方体。
LeetCode:892. 三维形体的表面积
LeetCode:892. 三维形体的表面积
LeetCode:892. 三维形体的表面积

解题方法:
LeetCode:892. 三维形体的表面积
我们可以对这样的一个二位数组进行遍历,因为相邻的面不能算在表面积中,所以解题的方法有俩种:
1、累减法:先将所有的面算出来,不考虑相邻不相邻,例如一个8个正方形,那么一共就有8*6=48个面;然后判断有没有相邻,如果相邻,那么就减去较小高度×2;这样就会把相邻的面去掉,得到最终结果
2、累加法:初始便面积为0,然后判断每一个正方体除去相邻面后剩下的面,最后相加

源码:

//累减法
int surfaceArea(int** grid, int gridSize, int* gridColSize){
    int i,j;
    int area = 0;
    int row = gridSize;
    int col = *gridColSize;
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if (grid[i][j] > 0) 
                area += (grid[i][j] * 4 + 2);
        }
    }
    for(i=0;i<row;i++){
        for(j=0;j<col;j++){
            if(j+1 < col && grid[i][j] >= grid[i][j+1])
                area = area - grid[i][j+1] * 2;
            if(j+1 < col && grid[i][j] < grid[i][j+1])
                area = area - grid[i][j] * 2;
            if(i+1 < gridSize && grid[i][j] >= grid[i+1][j])
                area = area - grid[i+1][j] * 2;
            if(i+1 < gridSize && grid[i][j] < grid[i+1][j])
                area = area - grid[i][j] * 2;
        }
    }
    return area;
}

踩坑点:

1、因为要判断是否相邻,所以会有i,j的邻接值的判断;我的解题方法只判断右侧和下侧,所以最后一列的右侧肯定不用判断,因为最后一列的右侧没有东西了;最后一行的下侧也不用判断,因为最后一行的下侧也没有东西了,所以有了代码中的i,j临界值的判断。
2、代码中的col和row的定义也没有必要,因为总是正方形,col=row=gridSize,所以可以统一用gridSize代替。

相关标签: LeetCode