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


    我的LeetCode:https://leetcode-cn.com/u/ituring/

    我的LeetCode刷题源码[GitHub]:https://github.com/izhoujie/Algorithmcii

    LeetCode 892. 三维形体的表面积

    题目

    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
    
    • 提示:

    • 1 <= N <= 50

    • 0 <= grid[i][j] <= 50

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/surface-area-of-3d-shapes
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解题思路

    思路1-计算单个位置的表面积,再考虑减去相邻位置的重叠面积;

    第一步先计算当前位置面积,第二步减去相邻位置的重叠面积;
    第二步有两种方案:

    • 方案1:减去上相邻和左相邻位置的重叠面积;
    • 方案2:减去上下左右相邻位置的重叠面积;

    总结:对比方案1和2,区别在与1省去了计算右边界和下边界的判断,而2四个边界均需要判断,方案1略优;(示例代码为方案1)

    算法源码示例

    package leetcode;
    
    /**
     * @author ZhouJie
     * @date 2020年3月25日 下午2:40:31 
     * @Description: 892. 三维形体的表面积
     *
     */
    public class LeetCode_0892 {
    
    }
    
    class Solution_0892 {
    	/**
    	 * @author: ZhouJie
    	 * @date: 2020年3月25日 下午4:19:42 
    	 * @param: @param grid
    	 * @param: @return
    	 * @return: int
    	 * @Description: 1-
    	 *
    	 */
    	public int surfaceArea(int[][] grid) {
    		int s = 0;
    		if (grid == null || grid.length == 0 || grid[0].length == 0) {
    			return s;
    		}
    		int n = grid.length;
    		for (int i = 0; i < n; i++) {
    			for (int j = 0; j < n; j++) {
    				// 当前位置的立方体数量
    				int h = grid[i][j];
    				if (h > 0) {
    					// h个叠加的立方体总面积为6*h-(h-1)*2即4h+2等价于(h<<2)+2;
    					s += (h << 2) + 2;
    					// 与上相邻和左相邻位置的重叠面计算,重叠面等于相邻的较少数*2
    					if (i > 0) {
    						s -= Math.min(h, grid[i - 1][j]) << 1;
    					}
    					if (j > 0) {
    						s -= Math.min(h, grid[i][j - 1]) << 1;
    					}
    				}
    			}
    		}
    		return s;
    	}
    }
    
    
  • 相关阅读:
    进程池和线程池、协程、TCP单线程实现并发
    GIL全局解释锁,死锁,信号量,event事件,线程queue,TCP服务端实现并发
    进程补充和线程的介绍
    进程的介绍和使用
    异常处理和UDP Socket套接字
    TCP Socket 套接字 和 粘包问题
    网络编程
    面向对象高级——反射和元类
    面向对象三大特性之——多态和一些内置函数
    面向对象-内置方法
  • 原文地址:https://www.cnblogs.com/izhoujie/p/12567012.html
Copyright © 2020-2023  润新知