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

    该题目为求解三维形体的表面积,主要是求解过程很清晰,数学问题!

    题目描述:

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

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

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

    实例1

    输入:[[2]]
    输出:10

    实例2

    输入:[[1,2],[3,4]]
    输出:34

    分析:
    实例1可知,当只有一摞立方体时,其表面积可以直接由长方体面积公式求得,S=grid[i][j]*4+2,四个侧面积加上下底面积即可!
    实例2:
      相邻的两个立方体会进行吸收,因此,相邻的表面积应该是较高的部分,减去较低的部分的剩余面积,我们需要进行分层计算。
      对于这个实例,分析如下:
      
      S横:以行为单位,第一行和最后一行的面积直接相加,其余相邻部分由相邻方块的差的绝对值构成;
      S纵:以列为单位,第一列和最后一列的面积直接相加,其余相邻部分同样由相邻方块差的绝对值构成;
      S底:只要单元格内有方块,就加上、下两个底面积,S底+=2,(不管是几个)
      总面积则等于三块面积相加总和,代码如下:
     1 class Solution {
     2 public:
     3     int surfaceArea(vector<vector<int>>& grid) {
     4         if(grid.size()==1)
     5             return grid[0][0]*4+2;
     6         int N=grid.size();
     7         int count=0;
     8         //先计算横向面积
     9         for(int i=0;i<N;i++)
    10         {
    11             for(int j=0;j<N;j++)
    12             {
    13                 if(i==0)  //首行相加
    14                     count+=grid[i][j];
    15                 else{
    16                     count+=abs(grid[i][j]-grid[i-1][j]);  //其余等于差的绝对值
    17                 }
    18                 if(i==N-1)  //尾行直接相加
    19                     count+=grid[i][j];
    20             }
    21         }
    22         //cout<<"hengxiang is "<<count<<endl;
    23         //再计算纵向面积
    24         for(int j=0;j<N;j++)
    25         {
    26             for(int i=0;i<N;i++)
    27             {
    28                 if(j==0)  //首列直接相加
    29                     count+=grid[i][j];
    30                 else{
    31                     count+=abs(grid[i][j]-grid[i][j-1]);  //其余等于差的绝对值
    32                 }
    33                 if(j==N-1)  //尾列直接相加
    34                     count+=grid[i][j];
    35             }
    36         }
    37         //计算上下面积
    38         int sum=0;
    39         for(int i=0;i<N;i++)
    40         {
    41             for(int j=0;j<N;j++)
    42             {
    43                 if(grid[i][j]>0)
    44                     sum++;
    45             }
    46         }
    47         //cout<<"sum is "<<sum<<endl;
    48         count+=(sum*2);  //上下两个底面积,加到结果上
    49 
    50         return count;
    51     }
    52 };
    
    

    简单题而已,清晰的编程思路很重要~~~

     
    
    
    
     
  • 相关阅读:
    mysql 查询本年当前季度数据
    eclipse导入项目出现红叉怎么办
    input框只能输入正数
    解压MAC压缩的zip文件
    文件上传,文件下载,解压zip文件,判断压缩文件里面包含几个文件,判断压缩文件里是否包含指定的后缀文件
    解决IE下readonly的Input光标选中的问题
    前端JS下载文件总结
    Angular变更检测策略报错
    笛卡尔算法
    Angualr 内置工具-SelectionModel
  • 原文地址:https://www.cnblogs.com/cnyulei/p/12077454.html
Copyright © 2011-2022 走看看