脚撕LeetCode(892)Easy

2022-01-18 08:18:01 浏览数 (1)

题目地址:https://leetcode-cn.com/problems/to-lower-case/submissions/

给你一个 n n 的网格grid ,上面放置着一些1 x 1 x 1的正方体。 每个值v = grid[i][j]表示v个正方体叠放在对应单元格(i, j)上。 放置好正方体后,任何直接相邻的正方体都会互相粘在一起,形成一些不规则的三维形体。 请你返回最终这些形体的总表面积。 注意: 每个形体的底面也需要计入表面积中。

代码语言:javascript复制
示例 1:
输入:grid = [[2]] 
输出:10 
示例 2:
输入:grid = [[1,2],[3,4]] 
输出:34
示例 3:
输入:grid = [[1,0],[0,2]] 
输出:16
示例 4:
输入:grid = [[1,1,1],[1,0,1],[1,1,1]] 
输出:32 
示例 5: 
输入:grid = [[2,2,2],[2,1,2],[2,2,2]]  
输出:46
提示:
n == grid.length 
n == grid[i].length 
1 <= n <= 50 
0 <= grid[i][j] <= 50

首先我们要明确的事,每个物体的表面积是上底 下底 侧面积 = 1 1 grid[i][j] *4

其次,当两个物体相邻的时候,减去的永远是最小的面积,所以如果有面积一面= 4 一面=2 那么总侧面及只需要-2 *2(两个物体的接壤面积都减去)

一、爆破法

爆破法的思维就是,将全部表面积和接壤的表面积sum,最后相减

记住,接壤面积是*2的

执行结果如下:

90 / 90 个通过测试用例

状态:通过

执行用时: 4 ms

内存消耗: 38 MB

代码语言:javascript复制
public static int surfaceAreaMe(int[][] grid) {
    int len = grid.length;
    int lenSub1 = len - 1;
    int subArea = 0;
    int sumArea = 0;
    for (int i = 0; i < len; i  ) {
        for (int j = 0; j < len; j  ) {
            // 立方体本应该有的表面积
            if (0 != grid[i][j])
                sumArea  = grid[i][j] * 4   2;
            if (i != lenSub1) {
               // 一行的相邻列的接壤面积
        subArea  = 2 * (grid[i][j] > grid[i   1][j] ? grid[i   1][j] : grid[i][j]);
         // 一列的相邻行接壤面积
        subArea  = 2 * (grid[j][i] > grid[j][i   1] ? grid[j][i   1] : grid[j][i]);
            }
        }
    }
    return sumArea - subArea;
}

这个解法只有双80,那么我们看看评论区大佬和官方答案的好方案

二、评论区大佬法

这个方法没有双百,但是至少时间上接近100%,我们来看看他的思路

首先是算出单方面高的面积,然后*2返回

执行结果如下:

90 / 90 个通过测试用例

状态:通过

执行用时: 3 ms

内存消耗: 38.2 MB

代码语言:javascript复制
public int surfaceArea(int[][] grid) {
    int x = 0;
    int y = 0;
    int z = 0;
    for(int i=0; i<grid.length; i  ) {
        x  = grid[i][0];
        y  = grid[0][i];
        z  = grid[i][0] != 0 ? 1 : 0;
        for(int j=1; j<grid.length; j  ) {
            // 横相邻比前一个高的数量
            x  = Math.max(grid[i][j] - grid[i][j-1], 0);
            // 纵相邻比前一个高的数量
            y  = Math.max(grid[j][i] - grid[j-1][i], 0);
            // 上下底
            z  = grid[i][j] != 0 ? 1 : 0;
        }
    }
    return 2 * (x   y   z);
}

不得不说第二种做法才是我一开始想的,但是因为自己调试了很久都在报错,所以就放弃了,不得不说,自己做不出来的事情一定会有人能做,下次不能轻易放弃自己一开始的办法。

0 人点赞