zoukankan      html  css  js  c++  java
  • 三维形体的表面积

    此博客链接:https://www.cnblogs.com/ping2yingshi/p/12569009.html

    三维形体的表面积(93min)

    题目链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes/solution/liang-chong-si-lu-zuo-jia-fa-yu-zuo-jian-fa-by-net/

    在 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

    题解:

             题意:题目真是看了好长时间才看懂题目。题目给的数不是坐标位置,给的是坐标位置上的正方形的个数。

                       grid 是一个二维数组,grid[i]中描述了若干个高度不一的立方体,这些立方体由边长为1x1x1堆叠而成。

                       grid=[[2]]的意思是在x=0,y=0处的长方体由2个立方体堆叠而成,高度为2,表面积就是2*6-2=10

                       grid=[[1,2],[3,4]]意思是
                       在x=0,y=0处的长方体由1个立方体堆叠而成,高度为1,表面积就是1x6=6
                       在x=0,y=1处的长方体由2个立方体堆叠而成,高度为2,表面积就是2x6-2=10,合计总面积=10+6-2=14,要减掉重叠的面积,1x2=2。
                       在x=1,y=0处的长方体由3个立方体堆叠而成,高度为3,表面积就是3x6-2x2=14,合计总面积=10+6+14-2-4=24,要减掉重叠的面积,2x2=4。
                       在x=1,y=1处的长方体由4个立方体堆叠而成,高度为4,表面积就是4x6-2x3=18,合计总面积=18+10+6+14-2-4-2-6=34,要减掉重叠的面积,3x2=6,1x2=2。

                       为啥坐标是从(0,0),(0,1),(1,0),(1,1)开始的,我也不知道为啥。

            方法:总面积减去重合面积。

            思路:

                      计算一共有多少个正方形,每个正方形都有6个面,假设有N个正方形,一共有6*N个面,但是需要去掉重合的面,重合面积分两种情况:

                     1.当正方形和右边的正方形重合。

                     2.当正方形和下面的正方形重合。

                     注意:在计算重合面积时,需要判断当前正方形和右面和做下面那个正方形矮,重合面积只能重合到矮正方形。

                     每有正方形重合就会减少两个面,所以正方形表面积等于N*6-重合面积*2。

                    说明:第一个(0,0)位置的正方形在N*N网格的左上角。

       代码:

    class Solution {
        public int surfaceArea(int[][] grid) {
            int len=grid.length;
            int sum=0;//计算总正方形个数
            int face=0;//计算正方形重合面积
            for(int i=0;i<len;i++)
               for(int j=0;j<len;j++)
               {
                   sum+=grid[i][j];
                   if(grid[i][j]>0)
                      face+=grid[i][j]-1;
                   if(i>0)//右面是i变,这里计算和右面重合的正方形
                      face+=Math.min(grid[i-1][j],grid[i][j]);
                    if(j>0)//下面是j变,这里计算和下面重合的正方形
                      face+=Math.min(grid[i][j-1],grid[i][j]);
               }
            
            return sum*6-face*2;
        }
    }
  • 相关阅读:
    elasticsearch restful api 关于PUT与POST
    elasticsearch关于 PUT /index/type/id
    Windows性能计数器相关基础(一)
    打了断点但VS2010断点无效
    使程序以管理员权限运行(C++)
    CListCtrl控件使用方法总结 --很详细(一)
    AdjustTokenPrivileges(进程权限)
    四种方法实现VC枚举系统当前进程
    MFC个人笔记--创建属性表,并通过文件操作,保存属性表中用户的选择 的步骤
    学习笔记--MFC在滚动条窗口如何使所图的图形不产生偏移
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/12569009.html
Copyright © 2011-2022 走看看