力扣题解_892_三维形体的表面积_(java code)

题目描述:
图来源:力扣
题目解释
一开始我不太懂这个题是神马意思,后来明白一个数组就是一行,每行的数字就是这个格子有几个立方体。
在这里插入图片描述
现在你可以看看你的小数字键盘。换做这里就是 [ [1,2,3],[4,5,6],[7,8,9] ].


解:
思路: 作减法 每重叠一次,就少两个面

  • 两个立方体重起来就少了2个面。仅仅讨论竖起来的重叠方向(好比柱子),那么重叠次数就是个数 - 1。
  • 考虑相邻的重叠,按行有重叠现象;按列也有重叠现象。刚好一次循环解决。那么相邻的重叠次数就是当前柱子和前一个柱子中最矮的那个(也就是共有的)。

那么重叠就分为三个部分:垂直(z)、行(x)、列(y)。
正方体总数为total
表面积 = tuaol * 6 - (垂直 + 行 + 列) * 2

package Array;
/**
 * 想法:
 * 	1.从主视图、俯视图、左视图入手,*2 即可得   奈何有空洞的地方,所以有些地方不可用 暂时不采取
 * 	2.利用重叠来减   因为每重叠一个正方体就会减少两个面  那么就用总的正方体个数 n*6 - 重叠的正方体个数 m*2  注意  正方体中会重复出现重叠,比如我一个正方体与两个正方体发生了重叠。
 * 					那么就要分别从行和列来考虑重叠的个数  
 * 					ps:垂直叠放的重叠也会减少 并且重叠的次数就是正方体个数 - 1
 * @author OrangeGirl
 *
 */
public class surfaceArea892三维形体的表面积 {
	public static void main(String[] args) {
		int[][] grid = {{2,2,2},{2,1,2},{2,2,2}};
		System.out.println(surfaceArea(grid));
	}
    public static int surfaceArea(int[][] grid) {
    	int n = grid.length;
    	int totalCubes = 0;
    	int verticalOverlap = 0;
    	int rowOverlap = 0;
    	int colOverlap = 0;
    	//从行列来判断
    	for(int i = 0;i < n;i++ ) {
    		for(int j = 0; j < n ;j++) {
    			totalCubes +=grid[i][j];
    			if(grid[i][j]>0) {
    				verticalOverlap += grid[i][j] - 1;//垂直的柱子重叠次数为个数-1
    				rowOverlap +=j>0? Math.min(grid[i][j], grid[i][j-1]):0;
        			colOverlap +=i>0? Math.min(grid[i][j], grid[i-1][j]):0;
    			}
    			
    		}
    	}
    	
    	return totalCubes*6 - (verticalOverlap + rowOverlap + colOverlap)*2;
    }
}
发布了9 篇原创文章 · 获赞 1 · 访问量 188
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览